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 /system/core | |
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
Diffstat (limited to 'system/core')
-rw-r--r-- | system/core/CodeIgniter.php | 1 | ||||
-rw-r--r-- | system/core/Common.php | 28 |
2 files changed, 29 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')) |