【问题标题】:What do we need the PHP-exception code for? Any use case scenario?我们需要 PHP 异常代码做什么?任何用例场景?
【发布时间】:2011-08-17 15:29:06
【问题描述】:

好的,对很多人来说这是一个非常蹩脚的问题,但我希望我会得到热烈的回应:)

当我在 PHP 中抛出异常时,我可以在消息中添加代码。
我捕获一个异常并根据其类型(如InvalidArgumentExceptionOutOfBoundException)处理它。我记录消息或显示它或做任何合适的事情。
我还可以添加前面的异常来跟踪错误来源的路径。

但有一件事我从未使用过或从未想过:代码有多大用处?

例如:

throw new Exception("db Error", $code, $previousException);

$code 可以做什么?

【问题讨论】:

  • (无关:我很确定“用例场景”是双重的......)
  • 只是要指出,你搞错了。应该是:throw new Exception( "db Error", $code, $previousException );

标签: php exception exception-handling


【解决方案1】:

我个人使用代码来获取压缩的错误消息,用户可以将其发送给支持人员。例如,假设用户尝试进行身份验证,但他失败了,我的代码会抛出一个 AuthenticateException 并显示消息:Failed to authenticate,以及一个特定代码指的是失败背后的真正问题。用户只会看到身份验证消息和代码,因此不知道身份验证失败的真正原因是什么。然后建议他,如果需要,请联系支持团队并提供代码。

根据异常代码,我们的支持同事可以轻松查明身份验证失败的真正原因(密码无效、用户名不存在、帐户被暂停等),并可以相应地帮助用户。

【讨论】:

    【解决方案2】:

    在面向对象的语言中,异常的类型表示它是什么类型的错误。但是,例如,如果您有两个可以生成相同异常类型的事物,则可以使用错误代码提供更多详细信息。

    错误代码是非面向对象语言中广泛使用的功能,用于传达它是什么类型的错误。

    【讨论】:

      【解决方案3】:

      我已经看到了将$code 用作 HTTP 状态代码的实现 (CakePHP)。

      我已经用一个例外子集实现了这个概念。因此,所有从HttpException 扩展的异常都会以 HTTP 错误响应

      【讨论】:

        【解决方案4】:

        $code 的解释方式取决于异常类型。例如,如果您有一个代表 MySQL 数据库错误的 Exception 子类,那么 $code 可能是本机 MySQL 错误代码。在低级 IO 错误的情况下,这可能是来自 <errno.h> 的值。

        基本上,$code 应该包含您以编程方式处理异常所需的任何内容。大多数异常都应该在某个地方处理。如果您的所有异常都简单地显示为错误,那么$code 仅在您需要包含来自诸如 MySQL 客户端库之类的库的错误代码时才有用。

        【讨论】:

          【解决方案5】:

          消息用于显示给用户,而代码供您的程序使用。因此,例如,在您的“数据库错误”示例中,您可能会编造一组代码,例如

          1. 无法连接
          2. 查询时出错
          3. 空结果
          4. 关闭连接时出错

          然后使用适当的代码。然后当你的代码的其他部分看到它们异常时,它们就会知道发生了什么并可能智能地处理它。

          【讨论】:

          • 首选什么?使用异常代码或多个异常类(\Exception\MySQL\ConnectionFailed\Exception\MySQL\EmptyResultSet 等)?谢谢! :)
          • @Phillipe:这确实是个人选择的问题,但通常情况下,如果案例数量较少,则使用不同的类,如果案例数量很大,则使用代码。在这个有四种情况的数据库示例中,不同的类就可以了。但是,如果您想到其他五个可能出错的地方,那么使用九个不同的异常类会很痛苦,而单独使用代码会更有意义。
          • 谢谢,有道理! :-)
          • 你真的会向用户显示消息吗?如果需要,本地化怎么办?将本地化消息放入异常中是否可以接受?
          • 您当然可以将本地化消息放入异常中,但在这种情况下,代码往往更有意义,因为代码可以用作 i18n 键。
          猜你喜欢
          • 2021-04-25
          • 1970-01-01
          • 2019-04-26
          • 1970-01-01
          • 2018-01-07
          • 1970-01-01
          • 1970-01-01
          • 2016-03-18
          • 1970-01-01
          相关资源
          最近更新 更多