php - 将 Try/catch 与 Do/While 结合使用

标签 php

这更像是一个概念性问题。

将 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/catchdo/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/

相关文章:

php - Html 输出标记发布到 mysql

php - 重定向到 url,然后再次重定向到主 url

php - 缩放 phpBB?

PHP MySQL 日期不工作

php - 将值从 PHP 粘贴到 JavaScript

PHP 类数据库连接范围问题

php - 防止重复下载相同的 CSS 文件

php - 在 laravel 5 facebook graph api 中找不到类 Facebook

php - mysql 查询没有给我正确的输出

php - 准备定制下载