-
Notifications
You must be signed in to change notification settings - Fork 170
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
44 changed files
with
768 additions
and
89 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
<?php namespace October\Rain\Exception; | ||
|
||
/** | ||
* This class represents an application exception. | ||
* Application exceptions are not logged in the error log. | ||
* | ||
* @package october\system | ||
* @author Alexey Bobkov, Samuel Georges | ||
*/ | ||
class ApplicationException extends ExceptionBase | ||
{ | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
<?php namespace October\Rain\Exception; | ||
|
||
use App; | ||
use Request; | ||
use Response; | ||
|
||
/** | ||
* System Error Handler, this class handles application exception events. | ||
* | ||
* @package october\system | ||
* @author Alexey Bobkov, Samuel Georges | ||
*/ | ||
class ErrorHandler | ||
{ | ||
/** | ||
* @var System\Classes\ExceptionBase A prepared mask exception used to mask any exception fired. | ||
*/ | ||
protected static $activeMask; | ||
|
||
/** | ||
* @var array A collection of masks, so multiples can be applied in order. | ||
*/ | ||
protected static $maskLayers = []; | ||
|
||
/** | ||
* All exceptions are piped through this method from the framework workflow. This method will mask | ||
* any foreign exceptions with a "scent" of the native application's exception, so it can render | ||
* correctly when displayed on the error page. | ||
* @param Exception $proposedException The exception candidate that has been thrown. | ||
* @return mixed Error page contents | ||
*/ | ||
public function handleException(\Exception $proposedException, $httpCode = 500) | ||
{ | ||
// Disable the error handler for test and CLI environment | ||
if (App::runningUnitTests() || App::runningInConsole()) { | ||
return; | ||
} | ||
|
||
// Detect AJAX request and use error 500 | ||
if (Request::ajax()) { | ||
return Response::make($proposedException->getMessage(), $httpCode); | ||
} | ||
|
||
// Clear the output buffer | ||
while (ob_get_level()) { | ||
ob_end_clean(); | ||
} | ||
|
||
// Friendly error pages are used | ||
if (($customError = $this->handleCustomError()) !== null) { | ||
return $customError; | ||
} | ||
|
||
// If the exception is already our brand, use it. | ||
if ($proposedException instanceof BaseException) { | ||
$exception = $proposedException; | ||
} | ||
// If there is an active mask prepared, use that. | ||
elseif (static::$activeMask !== null) { | ||
$exception = static::$activeMask; | ||
$exception->setMask($proposedException); | ||
} | ||
// Otherwise we should mask it with our own default scent. | ||
else { | ||
$exception = new ApplicationException($proposedException->getMessage(), 0); | ||
$exception->setMask($proposedException); | ||
} | ||
|
||
return $this->handleDetailedError($exception); | ||
} | ||
|
||
/** | ||
* Prepares a mask exception to be used when any exception fires. | ||
* @param Exception $exception The mask exception. | ||
* @return void | ||
*/ | ||
public static function applyMask(\Exception $exception) | ||
{ | ||
if (static::$activeMask !== null) { | ||
array_push(static::$maskLayers, static::$activeMask); | ||
} | ||
|
||
static::$activeMask = $exception; | ||
} | ||
|
||
/** | ||
* Destroys the prepared mask by applyMask() | ||
* @return void | ||
*/ | ||
public static function removeMask() | ||
{ | ||
if (count(static::$maskLayers) > 0) { | ||
static::$activeMask = array_pop(static::$maskLayers); | ||
} | ||
else { | ||
static::$activeMask = null; | ||
} | ||
} | ||
|
||
/** | ||
* Check if using a custom error page, if so return the contents. | ||
* Return NULL if a custom error is not set up. | ||
* @return mixed Error page contents. | ||
*/ | ||
public function handleCustomError() | ||
{ | ||
} | ||
|
||
/** | ||
* Displays the detailed system exception page. | ||
* @return View Object containing the error page. | ||
*/ | ||
public function handleDetailedError($exception) | ||
{ | ||
return 'Error: ' . $exception->getMessage(); | ||
} | ||
} |
Oops, something went wrong.