Laravel自定义异常

时间:2018-09-20 17:36:27

标签: php laravel exception laravel-5 laravel-exceptions

在发布此问题之前,我已经在互联网上搜索了适当的答案,但没有得到答案。这是我的以下问题:

1)如何在不尝试捕获laravel控制器的情况下引发异常并在被调用控制器的视图中获取异常。 示例:TestController.php

function index(){
throw new CustomException('Data not found');
return view('dashboard');
}

如何在仪表板视图中获取异常消息

2)假设我想返回格式为

,如何为异常消息设置格式

$response['code'] = 0;
        $response['status'] = 'error';
        $response['message'] = 'message';
        $response['data'] = '';

我创建了一个自定义例外,但不知道如何充分利用它

<?php

namespace App\Exceptions;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Mockery\Exception;

class CustomException extends Exception{

    public $response;


    /**
     * Report the exception.
     *
     * @return void
     */
    public function report()
    {
    }

    /**
     * Render the exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function render($request,$exception){
        ob_clean();
        $response['code'] = 0;
        $response['status'] = 'error';
        $response['message'] = 'Message';
        $response['data'] = '';
        if(!$request->ajax()){
            // non ajax response
        }else{
            return response()->json($response);
        }
    }

}

3 个答案:

答案 0 :(得分:0)

所有未捕获的异常均由默认异常处理程序拦截。如果您希望它的行为有所不同,则只需对其进行修改:https://laravel.com/docs/5.7/errors#the-exception-handler

答案 1 :(得分:0)

回答您的问题:

  1. 要传递此异常以查看,您可以实现render方法,该方法已经开始执行。您可以这样做:

    if(!$request->ajax()){
        view('error_handler', compact('exception'))
    } else {
       return response()->json($response);
    }
    

所以现在您只需创建error_handler.blade.php视图,就可以在其中访问$exception变量,因此可以在其中使用{{ $exception->getMessage}},依此类推

  1. 您尚未定义要实现的目标,但是它应该可以正常工作:

    public function render($request,$exception) {
    
        if(!$request->ajax()){
            view('error_handler', compact('exception'))
        }
    
        return response()->json([
                  'code' => $exception->getCode(),
                  'status' => 'error',
                  'message' => $exception->getMessage(),
                  'data' => 'sample data'
              ]);
    
    }
    

当然,您可以放置​​所需的任何内容,而不是使用$exception->getCode()代替code,这只是一个示例,您还可以使用在设置了一些自定义条件的情况下异常中包含的代码和消息例如,当您引发异常时:

throw new CustomException('This is custom message', 123);

答案 2 :(得分:0)

如果您的目的是在由控制器呈现的视图中显示该异常的消息,则没有真正的理由抛出异常。这不是管理异常的最佳方法,因为默认情况下,所有抛出的异常都是App\Exceptions\Handler类中的句柄和捕获。

我想您确切地知道何时创建的CustomExption类型将被抛出,但不是抛出该错误,而是对该错误进行特征化,该错误需要以不同的方式毫无例外地例外。为此,您可以创建一个包含旧代码,状态,消息,数据的数组,并将其传递给视图方法;

class CustomController extends Controller
{
    public function samemethod(){
         // some code that can generate an error

         // construct the error data
         $customErrorData = [
             'code' => 0000,
             'status' => "some status",
             'message' => "Some error message",
             'data' => [...]
         ];

         // After error data creation you can pass it to the view
         return View::make('customview', compact('customErrorData'));
    }
}

您的视图中有错误数据