6

我应该使用这种抛出错误的方法:

if (isset($this->dbfields[$var])) {
    return $this->dbfields[$var];
} else {
    throw new FieldNotFoundException($var);
}

或这种风格:

try {
    return $this->dbfields[$var];
} catch (Exception $e) {
    throw new FieldNotFoundException($var);
}

……还是别的什么?

快速解释代码: $this->dbfields是一个数组。isset()检查是否设置了变量,在这种情况下,检查数组元素是否存在。

4

7 回答 7

10

第二个例子不好。正如您所演示的,当您首先要防止异常时,您会花费大量开销来捕获异常。另外,您还假设您知道引发该异常的原因 - 如果有其他异常,例如内存不足或其他什么,即使不是,您也会将其报告为“未找到字段”。

请记住, C++ 和 Java 等语言中的try/catch非常昂贵,因为它们必须保存和恢复所有状态。另一方面,Python 有非常便宜的异常,它们积极鼓励您使用try/except进行简单验证。但即便如此,捕捉一切并假装它是一种异常仍然很糟糕。

于 2008-10-13T00:52:08.313 回答
4
//First let's do the checks.
if(!isset($this->dbfields[$var]))
    throw new FieldNotFoundException($var);
//Now we're in the clear!
return $this->dbfields[$var];
于 2008-10-13T00:53:41.493 回答
3

在大多数情况下,捕捉“异常”并不是一个好习惯,在您显示的两个中,我会使用选项 1。

捕获所有异常可能会隐藏不同的异常并将其屏蔽为 FileNotFoundException。

于 2008-10-13T00:52:09.577 回答
2

我更喜欢第一个,但如果 dbfields[$var] 在您访问不存在的元素时抛出一些合理的东西,那么我宁愿只返回它而不检查。

我不是特别喜欢更改异常类型,除非我有充分的理由——如果你这样做了,请确保尝试保留原始异常和堆栈跟踪。

于 2008-10-13T00:53:51.150 回答
0

只需重新阅读您的解释。

我猜你在#1 中的方法将捕获任何可能抛出的异常并简单地返回一个布尔值。我绝对不喜欢大多数时候捕获通用异常,所以#2不会是我的选择。

于 2008-10-13T00:54:43.957 回答
0

“……还是别的什么?”

两者都不是很好,所以其他东西是合适的。

修复版本 2 以捕获正确的异常,而不是所有可能的异常。将其作为选项 3 发布。我将支持捕获特定异常而不是Exception.

于 2008-10-13T01:08:39.967 回答
0

这与语言无关。

Some languages won't throw errors for accessing non-existant fields, and the preferred pattern depends a lot on the implementations of the arrays, tables, objects, etc.

于 2008-10-13T01:17:46.687 回答