diff --git a/cake/console/libs/console_error_handler.php b/cake/console/libs/console_error_handler.php
index 5dda75a3c..fc8414767 100644
--- a/cake/console/libs/console_error_handler.php
+++ b/cake/console/libs/console_error_handler.php
@@ -35,17 +35,19 @@ class ConsoleErrorHandler extends ErrorHandler {
* @var filehandle
* @access public
*/
- public $stderr;
+ public static $stderr;
/**
- * Class constructor.
+ * Get the stderr object for the console error handling.
*
* @param Exception $error Exception to handle.
* @param array $messages Error messages
*/
- function __construct($error) {
- $this->stderr = new ConsoleOutput('php://stderr');
- parent::__construct($error);
+ public static function getStderr() {
+ if (empty(self::$stderr)) {
+ self::$stderr = new ConsoleOutput('php://stderr');
+ }
+ return self::$stderr;
}
/**
@@ -54,57 +56,37 @@ class ConsoleErrorHandler extends ErrorHandler {
* @return void
*/
public static function handleException($exception) {
- $error = new ConsoleErrorHandler($exception);
- $error->render();
+ $stderr = self::getStderr();
+ $stderr->write(sprintf(
+ __("Error: %s\n%s"),
+ $exception->getMessage(),
+ $exception->getTraceAsString()
+ ));
}
/**
- * Do nothing, no controllers are needed in the console.
+ * Handle errors in the console environment.
*
* @return void
*/
- protected function _getController($exception) {
- return null;
+ public static function handleError($code, $description, $file = null, $line = null, $context = null) {
+ $errorConfig = Configure::read('Error');
+ if (isset($errorConfig['level']) && ($code & ~$errorConfig['level'])) {
+ return;
+ }
+ $stderr = self::getStderr();
+ list($name, $log) = self::_mapErrorCode($code);
+ $stderr->write(sprintf(
+ __("%s Error: %s in [%s, line %s]\n"), $name, $description, $file, $line
+ ));
}
/**
- * Overwrite how _cakeError behaves for console. There is no reason
- * to prepare urls as they are not relevant for this.
+ * undocumented function
*
- * @param $error Exception Exception being handled.
* @return void
*/
- protected function _cakeError($error) {
- $this->_outputMessage();
- }
-
-/**
- * Override error404 method
- *
- * @param Exception $error Exception
- * @return void
- */
- public function error400($error) {
- $this->_outputMessage();
- }
-
-/**
- * Override error500 method
- *
- * @param Exception $error Exception
- * @return void
- */
- public function error500($error) {
- $this->_outputMessage();
- }
-
-/**
- * Outputs the exception to STDERR.
- *
- * @param string $template The name of the template to render.
- * @return void
- */
- public function _outputMessage($template = null) {
+ public function render() {
$this->stderr->write(sprintf(
__("Error: %s\n%s"),
$this->error->getMessage(),
diff --git a/cake/tests/cases/console/libs/console_error_handler.test.php b/cake/tests/cases/console/libs/console_error_handler.test.php
index 81c3b5aae..0b0719a14 100644
--- a/cake/tests/cases/console/libs/console_error_handler.test.php
+++ b/cake/tests/cases/console/libs/console_error_handler.test.php
@@ -27,14 +27,36 @@ require_once CONSOLE_LIBS . 'console_error_handler.php';
class ConsoleErrorHandlerTest extends CakeTestCase {
/**
- * Factory method for error handlers with stderr() mocked out.
+ * setup, create mocks
*
* @return Mock object
*/
- function getErrorHandler($exception) {
- $error = new ConsoleErrorHandler($exception);
- $error->stderr = $this->getMock('ConsoleOutput', array(), array(), '', false);
- return $error;
+ function setUp() {
+ parent::setUp();
+ ConsoleErrorHandler::$stderr = $this->getMock('ConsoleOutput', array(), array(), '', false);
+ }
+
+/**
+ * teardown
+ *
+ * @return void
+ */
+ function tearDown() {
+ parent::tearDown();
+ ConsoleErrorHandler::$stderr = null;
+ }
+
+/**
+ * test that the console error handler can deal with CakeExceptions.
+ *
+ * @return void
+ */
+ function testHandleError() {
+ $content = 'Notice Error: This is a notice error in [/some/file, line 275]';
+ ConsoleErrorHandler::$stderr->expects($this->once())->method('write')
+ ->with($content);
+
+ ConsoleErrorHandler::handleError(E_NOTICE, 'This is a notice error', '/some/file', 275);
}
/**
@@ -44,12 +66,10 @@ class ConsoleErrorHandlerTest extends CakeTestCase {
*/
function testCakeErrors() {
$exception = new MissingActionException('Missing action');
- $error = $this->getErrorHandler($exception);
-
- $error->stderr->expects($this->once())->method('write')
+ ConsoleErrorHandler::$stderr->expects($this->once())->method('write')
->with($this->stringContains('Missing action'));
- $error->render();
+ ConsoleErrorHandler::handleException($exception);
}
/**
@@ -59,12 +79,11 @@ class ConsoleErrorHandlerTest extends CakeTestCase {
*/
function testNonCakeExceptions() {
$exception = new InvalidArgumentException('Too many parameters.');
- $error = $this->getErrorHandler($exception);
- $error->stderr->expects($this->once())->method('write')
+ ConsoleErrorHandler::$stderr->expects($this->once())->method('write')
->with($this->stringContains('Too many parameters.'));
- $error->render();
+ ConsoleErrorHandler::handleException($exception);
}
/**
@@ -74,12 +93,11 @@ class ConsoleErrorHandlerTest extends CakeTestCase {
*/
function testError404Exception() {
$exception = new NotFoundException('dont use me in cli.');
- $error = $this->getErrorHandler($exception);
-
- $error->stderr->expects($this->once())->method('write')
+
+ ConsoleErrorHandler::$stderr->expects($this->once())->method('write')
->with($this->stringContains('dont use me in cli.'));
- $error->render();
+ ConsoleErrorHandler::handleException($exception);
}
/**
@@ -89,23 +107,11 @@ class ConsoleErrorHandlerTest extends CakeTestCase {
*/
function testError500Exception() {
$exception = new InternalErrorException('dont use me in cli.');
- $error = $this->getErrorHandler($exception);
- $error->stderr->expects($this->once())->method('write')
+ ConsoleErrorHandler::$stderr->expects($this->once())->method('write')
->with($this->stringContains('dont use me in cli.'));
- $error->render();
+ ConsoleErrorHandler::handleException($exception);
}
-/**
- * test that ConsoleErrorHandler has a stderr file handle.
- *
- * @return void
- */
- function testStdErrFilehandle() {
- $exception = new InternalErrorException('dont use me in cli.');
- $error = new ConsoleErrorHandler($exception);
-
- $this->assertType('ConsoleOutput', $error->stderr, 'No handle.');
- }
}
\ No newline at end of file