异常是否应该处理返回的错误响应

Should Exceptions handle returning Error Responses

我创建并 API 并实现了各种自定义异常。似乎异常可以向用户呈现响应。所以我的控制器方法可以 return 一个响应,或者抛出一个自定义异常,这又 return 一个错误响应(见下文):

public function destroy($id)
{
    try {
        $myModel = MyModel::find($id);
        if ($myModel !== null) {
            $service = new ModelService($sequence);
            if($service->destroyModel())
                return $this->deleteSuccess($sequence);
        } else {
            throw new Exception('Could not find Model.', 404);
        }
    }
    catch(Exception $e)
    {
        throw new DeleteModelException($e->getMessage(), $e->getCode(), $e);
    }
    //this path is never reached, function technically has path that doesn't return
}

从技术上讲,我有一条 return 什么都没有的路径,但 DeleteModelException 处理了其余部分。

这是好的做法还是我应该将错误响应保留在控制器中?不知道为什么基础 Exception (Illuminate\Foundation\Exception) class 会允许渲染响应,如果不是这个的话。

我强烈推荐抛出自定义和描述性异常的做法,并让异常的呈现方法 return 为您做出响应。

当项目变大时,您使用应用程序观察工具(例如 sentry 跟踪异常情况,这些异常情况将有助于了解项目中发生的情况。

我愿意:

public function something(){

    try{
        // actions
    }
    catch(\Exception $e){
        throw new \SomethingFailedExeption('Faild to do something');
    }
}

然后创建一个classApp\Exceptions\SomethingFailedExeption

<?php

namespace App\Exceptions;

use Exception;
use Illuminate\Http\Request;

class SomethingFailedExeption extends Exception
{
    /**
     * Render the exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request
     * @return \Illuminate\Http\Response
     */
    public function render(Request $request)
    {
        return response()->json([
            'message' => $this->getMessage(),
            'somefield' -> $request->somefield
        ], 500);
    }
}

另外我会推荐 FindorFail() 而不是 Find() 这样 laravel 就会为你抛出异常