嗨,我是laravel的新手,正在处理自定义异常处理。
据我所知,我已经发现了所有的例外情况,而且运行良好。根据我的理解,set_exception_handler
用于处理未捕获的异常。现在我有两个问题:
1) 我必须知道我对set_exception_handler
的理解是否正确。
2) 如何在laravel 5中实现它来处理未捕获的异常
这就是我在控制器中实现set_exception_handler
的方式
class SearchController extends BaseController{
public function getTitleMessage($exc){
var_dump("set exception handler".$exc);
return json_encode("Error");
}
public function genericSearch(){
//Bussiness logic goes here
set_exception_handler('getTitleMessage');
throw new Exception("Search Failed");
}
这显示了一个错误,即set_exception_handler
不是有效的回调。所以我把代码改成了
set_exception_handler(array($this,'getTitleMessage'));
但也不适用于我。有人指导我如何在laravel控制器中实现它。提前感谢
查看vendorlaravelframeworksrcIlluminateFoundationBootstrapHandleExceptions.php
文件;正如您在bootstrap
方法中看到的,Laravel已经使用set_exception_handler
将handleException
方法设置为全局异常处理程序
当引发未捕获的异常时,该方法最终将调用AppExceptionsHandler::render
。
因此,如果你想以某种方式处理一个没有手动捕获的异常,你所要做的就是将你的代码添加到render
方法中:
app\Exceptions\Handler.php
public function render($request, Exception $e)
{
//DO WATHEVER YOU WANT WITH $e
return parent::render($request, $e);
}
您必须在app\Exceptions\handler.php呈现方法中实现自定义异常处理程序逻辑:
public function render($request, Exception $exception) {
if (method_exists($e, 'render') && $response = $e->render($request)){
return Router::prepareResponse($request, $response);
} elseif ($e instanceof Responsable) {
return $e->toResponse($request);
}
$e = $this->prepareException($e);
/* Your custom logic */
if ($e instanceof HttpResponseException) {
return $e->getResponse();
} elseif ($e instanceof AuthenticationException) {
return $this->unauthenticated($request, $e);
} elseif ($e instanceof ValidationException) {
return $this->convertValidationExceptionToResponse($e, $request);
}
return parent::render($request, $exception);
}