abort 和 throw

请问一下,在处理错误的时候,用 abort 还是 throw 更好一点

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7
YQuan

根据功能的调用以及实现方式来判断:
throw 可以返回清晰的错误讯息,自带trace,方便调试
abort 虽然可以返回错误讯息,但是debug较throw麻烦

下方是场景建议,仅供参考不是绝对,@someonelikeyou 话糙了些,但基本在理,思考错误反馈场景的便利性还是需要的

  1. 如果这是一个API或xmlhttprequest调用,多条件判定
    建议throw,并且返回清晰的错误信息,方便调试和客户反馈

  2. 如果是一个常见的页面跳转,判定条件单一
    建议abort

3.如果是一个敏感,有保密需求的页面
建议abort, 404 推荐,让恶意爬数据的人摸不清究竟是请求数据错误还是内容不存在

5年前 评论
庞浩然Paul

如果我遇到这个问题,我不知道 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 ,除非这个不满足你的需求,比如你有特定的返回格式要求,像公司统一规范。

5年前 评论

@庞浩然Paul 我之前也发现了 abort 底层是 throw Exception 了,但是问题是他们的语义是不一样的,所以我觉得
@YQuan 说的还是可以 throw可以有调试信息,abort 纯粹一个兜底页面,很多公司的404、401页面都是统一的,
@someonelikeyou 这位大神我觉得你倒要参考这篇帖子的内容好好回味一下,你真的搞清楚了?

5年前 评论

@someonelikeyou
你的意思只是“个人喜好”,那么可以理解为你这个人太过随便,写代码没有规矩。我前面已经都总结了区别,特意艾特你,让你学习和了解,很多东西并不是所谓的喜好,烂代码和好代码的区别就在于平时积累很多零碎知识和细节,很多方法和变量都是有「语义」,而并不是没有意义

与人为善,比聪明更重要!

5年前 评论

好像很少用abort耶,一般有错误都是使用抛出异常,或者自定义一些异常抛出(我个人爱好)

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!