Browse Source

Add support for custom console error handling

Both errors and exceptions can be configured for the console
at the application layer now.

Fixes #2696
mark_story 14 years ago
parent
commit
34e1afd8ef
1 changed files with 26 additions and 4 deletions
  1. 26 4
      lib/Cake/Console/ShellDispatcher.php

+ 26 - 4
lib/Cake/Console/ShellDispatcher.php

@@ -134,10 +134,8 @@ class ShellDispatcher {
 			include_once CAKE_CORE_INCLUDE_PATH . DS . 'Cake' . DS . 'Console' . DS . 'Templates' . DS . 'skel' . DS . 'Config' . DS . 'core.php';
 			App::build();
 		}
-		require_once CAKE . 'Console' . DS . 'ConsoleErrorHandler.php';
-		$ErrorHandler = new ConsoleErrorHandler();
-		set_exception_handler(array($ErrorHandler, 'handleException'));
-		set_error_handler(array($ErrorHandler, 'handleError'), Configure::read('Error.level'));
+		
+		$this->setErrorHandlers();
 
 		if (!defined('FULL_BASE_URL')) {
 			define('FULL_BASE_URL', 'http://localhost');
@@ -147,6 +145,30 @@ class ShellDispatcher {
 	}
 
 /**
+ * Set the error/exception handlers for the console
+ * based on the `Error.consoleHandler`, and `Exception.consoleHandler` values
+ * if they are set. If they are not set, the default ConsoleErrorHandler will be
+ * used.
+ *
+ * @return void
+ */
+	public function setErrorHandlers() {
+		App::uses('ConsoleErrorHandler', 'Console');
+		$error = Configure::read('Error');
+		$exception = Configure::read('Exception');
+
+		$errorHandler = new ConsoleErrorHandler();
+		if (empty($error['consoleHandler'])) {
+			$error['consoleHandler'] = array($errorHandler, 'handleError');
+		}
+		if (empty($exception['consoleHandler'])) {
+			$exception['consoleHandler'] = array($errorHandler, 'handleException');
+		}
+		set_exception_handler($exception['consoleHandler']);
+		set_error_handler($error['consoleHandler'], Configure::read('Error.level'));
+	}
+
+/**
  * Dispatches a CLI request
  *
  * @return boolean