这更像是一个概念性问题。
将 do/while 循环与 try/catch 混合使用是否可以接受/良好的编程?
例如:
<?php
function main() {
$failure = 0;
do {
$failure += foo();
$failure += bar();
...
if ($failure) { return $failure; }
}
while ($failure == 0);
}
function foo() {
try {
echo 'DO FOO STUFF<br />';
return 0;
}
catch (Exception $e) {
return 1;
}
}
function bar() {
try {
echo 'DO BAR STUFF<br />';
return 0;
}
catch (Exception $e) {
return 1;
}
}
?>
我问的原因是我在某处读到混合两者是不好的做法。您应该创建自己的异常并“抛出”它们。但这不是有点矫枉过正吗?
编辑: 为了解释这个问题出现的场景,想象一个必须遵循一条线的机器人。机器人每次迈出一步时都会计算其位置(X 位置、Y 位置、Z 位置和“姿势”位置)并将信息发送到服务器。服务器仔细检查此信息。如果发现任何异常,服务器会向机器人发送“停止”信号。机器人停止,重新计算其位置,重新发送信息并等待“开始”信号。
此循环示例基于从机器人收到的数据馈送。如果出现问题(如无线链路断开、障碍物或失误),机器人必须停下来以防止误入歧途、跌倒或发生任何事情。我们对知道哪里出了问题或为什么出错不感兴趣,只是知道它出错了(或没有)。 (这实际上是在代码的另一部分,而不是基于 PHP 的调试模块中处理的)。
编辑 2: 就像每个人指出的那样,正确的方法似乎是正确地引发/处理异常。 既然每个人似乎都同意这一点,我不知道该给谁打“正确答案”的勾。 如果可以的话,我会等几天,给票多的!
最佳答案
没有理由避免将 try/catch
与 do/while
混合使用。
但是您给出的示例在 do/while
方面的问题较少,而在 try/catch
block 中吞噬异常的问题较多。
捕获基本异常类型并吞下它在任何语言(PHP 或其他语言)中都是不好的做法。最好只捕获特定的异常类型,让其余的通过 catch block 处理。
例如,如果您正在访问一个文件,并捕获了 FileNotFound
异常(如果 PHP 中有这样的东西),那就没问题了。
但是如果您捕获所有异常类型,那么您将捕获诸如 OutOfMemoryException
之类的东西。如果你处理得当,并确保它不会再次抛出,那就没问题了。但在你的情况下,你可能没有为这种情况“做正确的事”,所以你应该让它失败。
您不想吃掉异常(不记录它们)的原因是,如果代码进入锁定的生产环境,您将无法对其进行调试。如果捕获到异常,那么用户将只能看到有错误的行为,而无法提交错误报告来为您提供足够的信息来调试它。他们也许能够为您提供重现步骤,但这非常不可靠。对于间歇性问题,这也几乎毫无值(value)。
如果你吃掉异常,你基本上是在丢弃对调试最有用的数据。
使这不太真实的事情:
- 有时在顶级 Web 代码中,您会想要捕获异常,记录它,然后吞下它,这样用户就看不到它(但是从函数返回,所以您不会在 buggy 状态)。这样一来,用户就不会看到有关您的代码的泄露信息(堆栈跟踪)。
- 如果您进行异常处理所用的语言对异常的支持很差,并且没有派生的异常类型。我对 PHP 了解不多,所以这在这种语言中可能是正确的,也可能不是。
关于php - 将 Try/catch 与 Do/While 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6222844/