我应该使用这种抛出错误的方法:
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()
检查是否设置了变量,在这种情况下,是否存在数组元素。
答案 0 :(得分:10)
第二个例子很糟糕。正如您所展示的那样,当您首先防止异常时,您需要花费大量开销来捕获异常。此外,你还假设你知道为什么抛出异常 - 如果有其他异常,比如说内存不足或其他什么,你将它报告为“未找到的字段”,即使它不是。
请记住,C ++和Java等语言中的try
/ catch
非常昂贵,因为他们必须保存和恢复所有状态。另一方面,Python有非常便宜的例外,他们积极鼓励您使用try
/ except
进行简单验证。但即便如此,抓住一切并假装它是一种例外情况仍然很糟糕。
答案 1 :(得分: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];
答案 2 :(得分:3)
在大多数情况下,捕捉“异常”并不是一个好习惯,在你展示的两个中,我会使用选项1.
捕获所有异常可能会隐藏不同的异常并将其作为FileNotFoundException进行掩码。
答案 3 :(得分:2)
我更喜欢第一个,但是如果dbfields [$ var]在你访问一个不存在的元素时会抛出一些合理的东西,那么我更愿意在没有检查的情况下返回它。
除非我有充分的理由,否则我不特别喜欢更改异常类型 - 如果你这样做,请确保尝试保留原始异常和堆栈跟踪。
答案 4 :(得分:0)
重新阅读你的解释。
我猜你在#1中的方法会捕获任何可能抛出的异常,只返回一个bool。我绝对不喜欢在大多数情况下捕获通用异常,所以#2不是我的选择。
答案 5 :(得分:0)
“......还是别的什么?”
两者都不是很好,所以其他东西也是合适的。
修复版本2以捕获正确的异常,而不是每个可能的异常。将其作为选项3发布。我将推荐捕获特定异常而不是Exception
的内容。
答案 6 :(得分:0)
这远非与语言无关。
某些语言不会因访问不存在的字段而抛出错误,而首选模式在很大程度上取决于数组,表,对象等的实现。