如何在Laravel 5中设置自定义异常处理程序


How to set custom exception handler in Laravel 5?

嗨,我是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控制器中实现它。提前感谢

Laravel已经使用了全局异常处理程序

查看vendor'laravel'framework'src'Illuminate'Foundation'Bootstrap'HandleExceptions.php文件;正如您在bootstrap方法中看到的,Laravel已经使用set_exception_handlerhandleException方法设置为全局异常处理程序

当引发未捕获的异常时,该方法最终将调用App'Exceptions'Handler::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);
   }