我有一个应用程序,其中我的控制器被分解成特定的组(API、CMS和前端),这已经使用路由器组设置了。我的问题是如何为每个组创建自定义错误处理。
例如,当在任何API控制器操作中发生异常时,我希望返回带有错误代码和消息的json,CMS中的异常将输出详细的错误页,前端的异常将将用户发送到通用的404或500错误页(酌情)。
我知道如何在每个控制器操作中手动完成此操作,但这可能会变得非常重复。理想情况下,我希望为每个处理程序创建一个处理程序,并自动全面地使用它。
我还知道App\ exception \Handler类,但是如果任何控制器组都可以返回一个ModelNotFoundException,那么如何区分异常来自何处?
是否还有其他地方可以插入这种类型的异常处理程序?
发布于 2015-03-05 21:35:02
如果您转到app\Exceptions\Handler.php
文件(您已经提到了),您可以随心所欲地做它。
例如,您可以这样定义您的render
函数:
public function render($request, Exception $e)
{
$trace = $e->getTraceAsString();
if ($e instanceof ModelNotFoundException
&& mb_strpos($trace, 'app\Http\Controllers\WelcomeController')
) {
return response()->json('Exception ' . $e->getMessage());
} elseif ($e instanceof ModelNotFoundException) {
return "General model not found";
}
return parent::render($request, $e);
}
并添加到导入use Illuminate\Database\Eloquent\ModelNotFoundException;
中。
现在,如果您在ModelNotFoundException
中抛出WelcomeController
,或者例如从WelcomeController
中运行另一个类的方法,这个方法将抛出ModelNotFoundException
,您可以跟踪它并返回json
响应。在其他情况下,如果异常将是ModelNotFoundException
的实例,则可以以其他方式呈现异常,而在所有其他情况下,可以使用标准异常方法来呈现异常。
通过这种方式,您不需要在控制器中定义任何东西,只需在Handler
中就可以这样做。更复杂的是,您可以创建单独的方法或创建新的类,以您想要的方式处理特定的异常,并在此处理程序中运行它们。
https://stackoverflow.com/questions/28886152
复制相似问题