Error handling 正确使用try。。抓住

Error handling 正确使用try。。抓住,error-handling,Error Handling,我是否应该使用这种抛出错误的方法: if (isset($this->dbfields[$var])) { return $this->dbfields[$var]; } else { throw new FieldNotFoundException($var); } 或者这种风格: try { return $this->dbfields[$var]; } catch (Exception $e) { throw new FieldNotFo

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

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()
检查是否设置了变量,在这种情况下,检查数组元素是否存在。

第二个示例不正确。正如您所演示的,捕获异常要花费大量的开销,而从一开始就很容易防止异常。此外,您还假设您知道引发该异常的原因-如果存在其他异常,例如内存不足或其他情况,即使未找到,您也会将其报告为“未找到字段”

记住,在C++和java语言中,<>代码> >代码> />代码> catch >代码非常昂贵,因为它们必须保存和恢复所有的状态。另一方面,Python有非常便宜的异常,它们积极鼓励您使用
尝试
/
除了
之外的方法进行简单验证。但即便如此,捕获所有内容并假装它是一种类型的异常仍然是不好的。

捕获“异常”在大多数情况下并不被认为是一种好的做法,在您显示的两种情况中,我会使用选项1


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

我更喜欢第一个异常,但如果在访问不存在的元素时dbfields[$var]抛出一些合理的异常,那么我更喜欢只返回它而不进行检查

//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];

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

请重新阅读您的解释

我猜#1中的方法将捕获可能抛出的任何异常,并简单地返回bool。我绝大多数时候都不喜欢捕获泛型异常,所以我不会选择#2。

“……或者其他什么?”

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


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

这远非语言不可知论


有些语言在访问不存在的字段时不会抛出错误,首选模式在很大程度上取决于数组、表、对象等的实现。

对于第二种语言,您实际上不必抛出异常,只需打印您捕获的异常。标准的“数组键不存在”错误(现在想想,这甚至都不是例外)在我使用这个方法的过程中,你不会觉得有道理。你应该认真考虑一下第一句话。我不认为捕捉异常从来都不是一个好的练习。很少可能,但不是永远。这不是我的第一个例子吗?“马克-这就是为什么我有超过3500的XP,我很快就找到了答案。”