我们需要 PHP 异常代码做啥?任何用例场景?

Posted

技术标签:

【中文标题】我们需要 PHP 异常代码做啥?任何用例场景?【英文标题】: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 ); 【参考方案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】:

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

    无法连接 查询时出错 空结果 关闭连接时出错

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

【讨论】:

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

以上是关于我们需要 PHP 异常代码做啥?任何用例场景?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何用Go来处理每分钟100万复杂请求的场景

场景法测试用例设计详解

单例模式的使用场景

工业智能网关是做啥的及典型应用场景?

常见的六种设计模式以及应用场景

测试用例场景法和缺陷报告