根据功能的调用以及实现方式来判断:
throw 可以返回清晰的错误讯息,自带trace,方便调试
abort 虽然可以返回错误讯息,但是debug较throw麻烦
下方是场景建议,仅供参考不是绝对,@someonelikeyou 话糙了些,但基本在理,思考错误反馈场景的便利性还是需要的
-
如果这是一个API或xmlhttprequest调用,多条件判定
建议throw,并且返回清晰的错误信息,方便调试和客户反馈 - 如果是一个常见的页面跳转,判定条件单一
建议abort
3.如果是一个敏感,有保密需求的页面
建议abort, 404 推荐,让恶意爬数据的人摸不清究竟是请求数据错误还是内容不存在
如果我遇到这个问题,我不知道 abort( ) 与 throw 有什么区别,我第一反应去找源代码。
vendor/laravel/framework/src/illuminate/Foundation/helpers.php
/**
* Throw an HttpException with the given data.
*
* @param \Symfony\Component\HttpFoundation\Response|\Illuminate\Contracts\Support\Responsable|int $code
* @param string $message
* @param array $headers
* @return void
*
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
*/
function abort($code, $message = '', array $headers = [])
{
if ($code instanceof Response) {
throw new HttpResponseException($code);
} elseif ($code instanceof Responsable) {
throw new HttpResponseException($code->toResponse(request()));
}
app()->abort($code, $message, $headers);
}
看到注释第一句话,Throw an HttpException with the given data.
,感觉这也是一个封装的 throw 。下面还有一个 abort 方法,再进去看。
/**
* Throw an HttpException with the given data.
*
* @param int $code
* @param string $message
* @param array $headers
* @return void
*
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
*/
public function abort($code, $message = '', array $headers = [])
{
if ($code == 404) {
throw new NotFoundHttpException($message);
}
throw new HttpException($code, $message, null, $headers);
}
由此我认为 abort 是一个封装好的 http exception ,当我们遇到这类异常不需要再手动 throw ,除非这个不满足你的需求,比如你有特定的返回格式要求,像公司统一规范。
@庞浩然Paul 我之前也发现了 abort
底层是 throw Exception
了,但是问题是他们的语义是不一样的,所以我觉得
@YQuan 说的还是可以 throw可以有调试信息,abort 纯粹一个兜底页面,很多公司的404、401页面都是统一的,
@someonelikeyou 这位大神我觉得你倒要参考这篇帖子的内容好好回味一下,你真的搞清楚了?
@someonelikeyou
你的意思只是“个人喜好”,那么可以理解为你这个人太过随便,写代码没有规矩。我前面已经都总结了区别,特意艾特你,让你学习和了解,很多东西并不是所谓的喜好,烂代码和好代码的区别就在于平时积累很多零碎知识和细节,很多方法和变量都是有「语义」,而并不是没有意义
与人为善,比聪明更重要!
推荐文章: