summaryrefslogtreecommitdiffstats
path: root/system
diff options
context:
space:
mode:
authorAndrey Andreev <narf@devilix.net>2013-09-12 19:10:21 +0200
committerAndrey Andreev <narf@devilix.net>2013-09-12 19:10:21 +0200
commitcf4cbaf121e9a9897ee899d91b10cd2c2668a311 (patch)
tree83f036aa02a322ae631ec850e7c8535130eb82a2 /system
parent824ced49aca4c4b67f13289402aa3ec607819cbb (diff)
parent8ce3134e739c688f2a3ade0d8c792d05d7879a78 (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')
-rw-r--r--system/core/CodeIgniter.php1
-rw-r--r--system/core/Common.php28
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'))