2

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

1)如何在 laravel 控制器中不尝试 catch 就抛出异常,并在被调用控制器的视图中获取异常。 示例: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);
        }
    }

}
4

3 回答 3

2

回答您的问题:

  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()for code,这只是一个示例,假设您在抛出异常时设置了一些自定义,这只是一个示例,您还可以使用您在异常中拥有的代码和消息,例如:

throw new CustomException('This is custom message', 123);
于 2018-09-20T18:26:43.073 回答
1

如果您的目的是在控制器呈现的视图中显示该异常的消息,则没有理由抛出异常。而且这不是管理异常的最佳方法,因为默认情况下,所有抛出的异常都是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'));
    }
}

您的视图中有错误数据

于 2018-09-20T23:29:22.897 回答
0

默认异常处理程序会拦截所有未捕获的异常。如果你想让它表现不同,你只需要修改它:https ://laravel.com/docs/5.7/errors#the-exception-handler

于 2018-09-20T17:40:07.033 回答