forked from bcit-ci/CodeIgniter
/
Exceptions.php
executable file
·267 lines (244 loc) · 7.12 KB
/
Exceptions.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/**
* CodeIgniter
*
* An open source application development framework for PHP 5.2.4 or newer
*
* NOTICE OF LICENSE
*
* Licensed under the Open Software License version 3.0
*
* This source file is subject to the Open Software License (OSL 3.0) that is
* bundled with this package in the files license.txt / license.rst. It is
* also available through the world wide web at this URL:
* http://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to obtain it
* through the world wide web, please send an email to
* licensing@ellislab.com so we can send you a copy immediately.
*
* @package CodeIgniter
* @author EllisLab Dev Team
* @copyright Copyright (c) 2008 - 2012, EllisLab, Inc. (http://ellislab.com/)
* @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* @link http://codeigniter.com
* @since Version 1.0
* @filesource
*/
/**
* Exceptions Class
*
* @package CodeIgniter
* @subpackage Libraries
* @category Exceptions
* @author EllisLab Dev Team
* @link http://codeigniter.com/user_guide/libraries/exceptions.html
*/
class CI_Exceptions {
/**
* Nesting level of the output buffering mechanism
*
* @var int
*/
public $ob_level;
/**
* List if available error levels
*
* @var array
*/
public $levels = array(
E_ERROR => 'Error',
E_WARNING => 'Warning',
E_PARSE => 'Parsing Error',
E_NOTICE => 'Notice',
E_CORE_ERROR => 'Core Error',
E_CORE_WARNING => 'Core Warning',
E_COMPILE_ERROR => 'Compile Error',
E_COMPILE_WARNING => 'Compile Warning',
E_USER_ERROR => 'User Error',
E_USER_WARNING => 'User Warning',
E_USER_NOTICE => 'User Notice',
E_STRICT => 'Runtime Notice'
);
/**
* Initialize execption class
*
* @return void
*/
public function __construct()
{
$this->ob_level = ob_get_level();
// Note: Do not log messages from this constructor.
}
// --------------------------------------------------------------------
/**
* Exception Logger
*
* This function logs PHP generated error messages
*
* @param string the error severity
* @param string the error string
* @param string the error filepath
* @param string the error line number
* @return void
*/
public function log_exception($severity, $message, $filepath, $line)
{
$severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;
log_message('error', 'Severity: '.$severity.' --> '.$message. ' '.$filepath.' '.$line, TRUE);
}
// --------------------------------------------------------------------
/**
* 404 Page Not Found Handler
*
* Calls the 404 override method if configured, or displays a generic 404 error.
*
* @param string the page
* @param bool log error yes/no
* @return string
*/
public function show_404($page = '', $log_error = TRUE)
{
// By default we log this, but allow a dev to skip it
$heading = '404 Page Not Found';
if ($log_error)
{
log_message('error', $heading.' --> '.$page);
}
// Set status header
set_status_header(404);
// Route the error to a controller or 404 template and exit
$args = array(
'heading' => $heading,
'message' => 'The page you requested was not found.'
);
$this->_route_error('404_override', 'error_404', $args);
exit;
}
// --------------------------------------------------------------------
/**
* General Error Page
*
* This function takes an error message as input and passes it to the error
* override method if configured, or displays it using the specified template.
* The override method will get the heading and message(s) as its first arguments,
* followed by any trailing segments of the override route. So, if the override
* route was "errclass/method/one/two", the effect would be to call:
* errclass->method($heading, $message, "one", "two");
*
* @param string the heading
* @param mixed the message string or array of strings
* @param string the template name
* @param int the status code
* @return string
*/
public function show_error($heading, $message, $template = 'error_general', $status_code = 500)
{
// Set status header
set_status_header(500);
// Route the error to a controller or error template and exit
$args = array(
'heading' => $heading,
'message' => $message
);
$this->_route_error('error_override', 'error_general', $args);
exit;
}
// --------------------------------------------------------------------
/**
* Native PHP error handler
*
* @param string the error severity
* @param string the error string
* @param string the error filepath
* @param string the error line number
* @return string
*/
public function show_php_error($severity, $message, $filepath, $line)
{
$severity = isset($this->levels[$severity]) ? $this->levels[$severity] : $severity;
$filepath = str_replace('\\', '/', $filepath);
// For safety reasons we do not show the full file path
if (FALSE !== strpos($filepath, '/'))
{
$x = explode('/', $filepath);
$filepath = $x[count($x)-2].'/'.end($x);
}
// Route the error to a controller or exception template
$args = array(
'severity' => $severity,
'message' => $message,
'filepath' => $filepath,
'line' => $line
);
$this->_route_error('exception_override', 'error_php', $args);
}
// --------------------------------------------------------------------
/**
* Route error to an override controller or a template
*
* @param string Override route name
* @param string Template name
* @param array Route/template arguments
* @return void
*/
protected function _route_error($route, $template, $args = NULL)
{
// Clear any output buffering
if (ob_get_level() > $this->ob_level + 1)
{
ob_end_flush();
}
// Check Router for an override
$CI =& get_instance();
if (isset($CI->router))
{
$stack = $CI->router->get_error_route($route);
if ($stack !== FALSE)
{
// Check for arguments
if ( ! empty($args))
{
// Insert or append arguments
if (count($stack) > CI_Router::SEG_ARGS)
{
// Insert args after path, subdir, class, and method and before other args
$stack = array_merge(
array_slice($stack, 0, CI_Router::SEG_ARGS),
$args,
array_slice($stack, CI_Router::SEG_ARGS)
);
}
else
{
// Just append args to the end
$stack = array_merge($stack, $args);
}
}
// Ensure "routed" is not set
if (isset($CI->routed))
{
unset($CI->routed);
}
// Load the error Controller as "routed" and call the method
if ($CI->load->controller($stack, 'routed'))
{
// Display the output and return
$CI->output->_display();
return;
}
}
}
// If the override didn't exit above, just export the args and display the template
if (isset($args['message']))
{
// Wrap message(s) in P tags
$args['message'] = '<p>'.implode('</p><p>', (array) $args['message']).'</p>';
}
extract($args);
ob_start();
include(VIEWPATH.'errors/'.$template.'.php');
echo ob_get_clean();
}
}
/* End of file Exceptions.php */
/* Location: ./system/core/Exceptions.php */