diff options
author | Andrey Andreev <narf@devilix.net> | 2013-09-12 19:10:21 +0200 |
---|---|---|
committer | Andrey Andreev <narf@devilix.net> | 2013-09-12 19:10:21 +0200 |
commit | cf4cbaf121e9a9897ee899d91b10cd2c2668a311 (patch) | |
tree | 83f036aa02a322ae631ec850e7c8535130eb82a2 | |
parent | 824ced49aca4c4b67f13289402aa3ec607819cbb (diff) | |
parent | 8ce3134e739c688f2a3ade0d8c792d05d7879a78 (diff) |
Merge pull request #2633 from kaiwangchen/simulate_complete_exception_handler
Simulate a complete custom exception handler by redirecting uncaught events
-rw-r--r-- | system/core/CodeIgniter.php | 1 | ||||
-rw-r--r-- | system/core/Common.php | 28 | ||||
-rw-r--r-- | user_guide_src/source/changelog.rst | 1 |
3 files changed, 30 insertions, 0 deletions
diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index c962fda20..67c94cfd1 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -73,6 +73,7 @@ defined('BASEPATH') OR exit('No direct script access allowed'); * ------------------------------------------------------ */ set_error_handler('_exception_handler'); + register_shutdown_function('_shutdown_handler'); if ( ! is_php('5.4')) { diff --git a/system/core/Common.php b/system/core/Common.php index 7f296b133..edfad99c5 100644 --- a/system/core/Common.php +++ b/system/core/Common.php @@ -577,6 +577,34 @@ if ( ! function_exists('_exception_handler')) } } +// ------------------------------------------------------------------------ + +if ( ! function_exists('_shutdown_handler')) +{ + /** + * Shutdown Handler + * + * This is the shutdown handler that is declared at the top + * of CodeIgniter.php. The main reason we use this is to simulate + * a complete custom exception handler. + * + * E_STRICT is purposivly neglected because such events may have + * been caught. Duplication or none? None is preferred for now. + * + * @link http://insomanic.me.uk/post/229851073/php-trick-catching-fatal-errors-e-error-with-a + * @return void + */ + function _shutdown_handler() + { + $last_error = function_exists('error_get_last') ? error_get_last() : NULL; + if (isset($last_error) && + ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) + { + _exception_handler($last_error['type'], $last_error['message'], $last_error['file'], $last_error['line']); + } + } +} + // -------------------------------------------------------------------- if ( ! function_exists('remove_invisible_characters')) diff --git a/user_guide_src/source/changelog.rst b/user_guide_src/source/changelog.rst index 3e36d88f5..c99afc112 100644 --- a/user_guide_src/source/changelog.rst +++ b/user_guide_src/source/changelog.rst @@ -436,6 +436,7 @@ Release Date: Not Released - Added support for HTTP-Only cookies with new config option *cookie_httponly* (default FALSE). - Renamed method ``_call_hook()`` to ``call_hook()`` in the :doc:`Hooks Library <general/hooks>`. - ``$config['time_reference']`` now supports all timezone strings supported by PHP. + - Made the exception handler complete by registering a shutdown handler to redirect critical events such as PHP parse errors to it, so that they can be displayed and logged without the help of the standard PHP error handler. Bug fixes for 3.0 |