异常是否应该处理返回的错误响应
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 就会为你抛出异常
我创建并 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 就会为你抛出异常