很多开发者在开发过程中都会遇到异常,处理过程大同小异:捕获然后处理,事实上也确实是如此。但本文不打算谈太多错误与异常的原理,只是从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来处理可能会抛出的异常,也建议大家这么做。好处是及时捕获不可预知的错误,给用户一个更好的体验。
简单的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类中,我们也可以自定义返回的数据格式和状态码等等。在工作中,我个人比较喜欢建一些自定义的异常类,也会很好管理。
大多时候(除:网络故障与请求被阻止外),使用fetch()返回的 Promise被标记为resolve,包括(接收到一个代表错误的 HTTP 状态码时,HTTP 响应的状态码是 404 或 500,但是,此时会将 resolve 的返回值的 ok 属性设置为 false
JavaScript 错误和一般处理 throw new Error(\'something went wrong\') 会在 JavaScript 中创建一个错误实例,并停止脚本的执行,除非你对错误做了一些处理。当你作为 JavaScript 开发者开启自己的职业生涯时,你自己很可能不会这样做
ECMA-262第3版引入了try catch语句,作为JavaScript中处理异常的一种标准方式。基本的语法如下所示。但是在前端js代码中很少看到try catch语句,并不是所以代码都需要加try catch来作得不偿失的保险
在前端项目中,由于JavaScript本身是一个弱类型语言,加上浏览器环境的复杂性,网络问题等等,很容易发生错误。做好网页错误监控,不断优化代码,提高代码健壮性是一项很重要的工作
异常(Exception)是一种错误处理机制,用于在指定的错误发生时改变脚本的正常流程。当异常被触发时,当前代码状态被保存,代码执行被切换到预定义的异常处理器函数(如果有)
js中的异常处理语句有两个,一个是try……catch……,一个是throw。try……catch用于语法错误,错误有name和message两个属性。throw用于逻辑错误。对于逻辑错误,js是不会抛出异常的
try中没有抛出异常,则catch语句不执行,如果有finally语句,则接着执行finally语句,继而接着执行finally之后的语句;不管是否try...catch,finally都会被执行。当try...catch中有return的话,finally后会执行try...catch中的return
首先一个常识就是,在浏览器执行JS脚本过程中,当出现脚本错误,并且你没有手动进行异常捕捉时,他会在浏览器下面出现黄色的叹号,这是正常的
最近观察项目 CI 跑的情况如何时,会偶尔发现一两个镜像虽然构建成功但是容器跑不起来的情况。究其原因,是因为一个 exit code 的问题
不少前端工程师看到这个标题可能会产生质问:我js用得好好的,能后端能APP,为什么还要学习Python?至少有下面两个理由:
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!