检测特定异常Laravel 5.1

检测特定异常Laravel 5.1,laravel,laravel-5,Laravel,Laravel 5,首先,我想捕获abort 403错误,我认为它会抛出AccessDeniedHttpException,所以我尝试像这样捕获错误 <?php namespace App\Exceptions; use Exception; use Illuminate\Database\Eloquent\ModelNotFoundException; use Symfony\Component\HttpKernel\Exception\HttpException; use Symfony\Compon

首先,我想捕获abort 403错误,我认为它会抛出AccessDeniedHttpException,所以我尝试像这样捕获错误

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

use Event;

use App\Events\UserNotAllowed;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that should not be reported.
     *
     * @var array
     */    
        protected $dontReport = [
        HttpException::class,
        ModelNotFoundException::class,
        AccessDeniedHttpException::class,
    ];

    /**
     * Report or log an exception.
     *
     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
     *
     * @param  \Exception  $e
     * @return void
     */
    public function report(Exception $e)
    {
        return parent::report($e);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $e
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $e)
    {
        if ($e instanceof AccessDeniedHttpException) {
            Event::fire(new UserNotAllowed($request));
            return redirect()->to("/home");
        }
        if ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        }
        return parent::render($request, $e);
    }
    public function render($request, Exception $e)
    {
        // Or === 
        if ($e->getStatusCode() == 403) {
            Event::fire(new UserNotAllowed($request));
            return redirect()->to("/home");
        }
        if ($e instanceof ModelNotFoundException) {
            $e = new NotFoundHttpException($e->getMessage(), $e);
        }
        return parent::render($request, $e);
    }
但在执行此操作时,所有其他错误页面都无法正常工作,在我的webrowser中出现了500个一般错误
有没有一种简单的方法可以在不更改Laravel的整个src abort函数的情况下侦听或捕获错误?

您可以在异常处理程序中使用报告方法,如下所示:


您可以在异常处理程序中使用report方法,如下所示:


是否有特定的需要?我想知道用户何时尝试访问他们不允许访问的页面。是否有特定的需要?我想知道用户何时尝试访问他们不允许访问的页面。不,这是可行的,但您应该在中止中定义错误类型。使用中止(404)。我已经更新了答案以满足您的需要。abort()需要一个参数,因此abort()只会引发另一个异常。是的。。。可以这样做,但我不是说找不到页面(404),而是访问被拒绝(403)。所以当有人试图访问一个不存在的页面时,它不会填满那些拼写错误的人的无用日志。我不确定,你想达到什么目的,但不管是哪种异常类型,它都能工作。您只需要知道异常类型。对于403,类型为HttpException。您也可以通过statusCode进行检查,我将更新答案以显示。不,它可以工作,但您应该在中止中定义错误类型。使用中止(404)。我已经更新了答案以满足您的需要。abort()需要一个参数,因此abort()只会引发另一个异常。是的。。。可以这样做,但我不是说找不到页面(404),而是访问被拒绝(403)。所以当有人试图访问一个不存在的页面时,它不会填满那些拼写错误的人的无用日志。我不确定,你想达到什么目的,但不管是哪种异常类型,它都能工作。您只需要知道异常类型。对于403,类型为HttpException。您也可以通过statusCode进行检查,我将更新答案以显示这一点。
public function report(Exception $e)
{
    if ($e instanceof HttpException) {
      echo $e->getStatusCode();
    }  
    return parent::report($e);
}