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

时间:2016-04-13 04:06:43

标签: php laravel exception-handling 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控制器中实现它。提前致谢

2 个答案:

答案 0 :(得分:1)

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

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

当引发未捕获的异常时,该方法最终会调用App\Exceptions\Handler::render

因此,如果您想以某种方式处理您未手动捕获的异常,您只需将代码添加到render方法:

应用\例外\ Handler.php

public function render($request, Exception $e)
{
    //DO WATHEVER YOU WANT WITH $e

    return parent::render($request, $e);
}

答案 1 :(得分:1)

您已在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);
   }