很多开发者在开发过程中都会遇到异常,处理过程大同小异:捕获然后处理,事实上也确实是如此。
但本文不打算谈太多错误与异常的原理,只是从laravel
自带的Exception
入手,谈一谈怎样用一个更好的方式处理错误信息。
异常
先举个简单的例子,在laravel
中,如果一个Model
找不到或者没有,很容易就抛出一个异常,大家常见的Whoops, something went wrong
诸如此类。这也只是在APP_DEBUG=false
的情况下,但这并不能带给用户更有用的信息。
User::findOrFail(1);
findOrFail
方法在Model
没有的情况下会显示:Sorry, the page you are looking for could not be found.
。这是一个404
的错误页面,很多时候都应该这样返回,如果我们想知道更多有用的信息呢?
try...catch
我在工作中也喜欢用try catch
来处理可能会抛出的异常,也建议大家这么做。好处是及时捕获不可预知的错误,给用户一个更好的体验。
简单的demo
,如下
try {
$user = User::findOrFail(1);
} catch (ModelNotFoundException $exception) {
return back()->withError($exception->getMessage())->withInput();
}
我们也可以这样:
if (! User::find(1)) {
throw new UserNotFoundException('...', 404);
}
自定义异常
Laravel
框架允许我们自定义exception
执行命令
php artisan make:exception UserNotFoundException
系统会自动在Exceptions
目录下创建一个UserNotFoundException
类,这个类继承了Exception
,这就给了我们一个自由发挥的机会
namespace App\Exceptions;
use Exception;
class UserNotFoundException extends Exception
{
public function render($request, $e)
{
if ($request->expectsJson()) {
// 如果是ajax请求...
}
return redirect()->to('...');
}
}
判断异常
在Exceptions
中的Handle.php
文件中,我们看到有个render()
方法,这里就是我们判断自定义异常的地方
// Handle.php
if ($exception instanceof UserNotFoundException) {
return $exception->render($exception, $request);
}
可以看到,我们只需要判断抛出的异常是否是UserNotFoundException
的实例即可。
而在UserNotFoundException
类中,我们也可以自定义返回的数据格式和状态码等等。在工作中,我个人比较喜欢建一些自定义的异常类,也会很好管理。