php - 带有 ErrorException 的控制台命令退出我的脚本,而不是在发生错误后继续

标签 php laravel phpseclib

我刚刚从 4.2 升级到 5.0。我的所有命令都正常工作,但我注意到在一个脚本中我看到一个错误(预期的错误),该错误报告 ErrorException。问题是,它使我的脚本无法继续,而不是继续 foreach 循环中的下一步。在4.2上同样的脚本出现同样的错误会报错并继续。

4.2:无法连接到 xyz.IP 错误 60。操作超时

5.0:[ErrorException] 无法连接到 xyz.IP 错误 60。操作超时

有关更多上下文:我正在使用脚本通过 SSH 连接到几台服务器并运行 Ping 命令。我正在使用 Phpseclib 1.0。我已经在旧的 4.2 版本上测试了 phpseclib,它工作正常。 5.0 是问题开始出现的地方。

有谁知道如何让脚本在 ErrorException 后继续运行?

foreach ($query as $key => $value) {

    $ssh = new Net_SSH2($value->origin_ip);
    $key = new Crypt_RSA();
    $key->loadKey(decryptIt($value->password));

    if (!$ssh->login($value->username, $key)) {
        exit('Login Failed');
    }

    $this->info('    Running Ping');

    //$ssh->setTimeout(1);
    if ($ssh->read('/.*@.*[$|#]/', NET_SSH2_READ_REGEX)) {
        //echo "reading";
        //$this->info('    Running Ping');

        //$ssh->setTimeout(4);

        $statusOutput=$ssh->exec("ping -c 1 -W 1 ".$value->destination_ip." >/dev/null 2>&1; echo $? ");

    } else {
        //echo "not reading";
        $this->error("Unable to Read Ping");
    }
}

最佳答案

要在脚本中内联处理异常,请使用 try...catch block :

try {
    $value = someFunctionThatMayCauseAnException();
} catch (Exception $e) {
    $errorMessage = $e->getMessage();
}

有关详细信息,请参阅 PHP 手册条目 Exceptions

“未捕获”异常将停止您的脚本。有时,这就是想要的效果。例如,您使用的 SSH 库不会捕获方法内发生的异常,它们被允许冒泡到调用脚本。也许您的调用脚本捕获了它们,或者您可能让它们继续冒泡到您的全局异常处理程序。处理异常的方法有很多种,但一般的经验法则是,除非您要对其执行某些操作(例如显示错误消息),否则您不会捕获它们。

您的脚本将在以前的版本中继续,因为错误很可能是作为警告或通知发出的,并返回 false 来指示失败。在较新的 PHP 版本中,该库开始发出异常,立即指示失败并提供包含有关失败的详细信息的异常对象。

这意味着您必须重构循环内的逻辑,而不是直接在条件 if 中调用函数。您没有指定示例中哪一行发出异常,但例如,这是您可以重组以处理异常的一种方法:

$errorMessage = false;
try {
    $ssh->login($value->username, $key); // this code is attempted
} catch (Exception $e) {
    // if an exception is emitted 
    // in the try block above, this block
    // is reached. Otherwise, it is skipped
    $errorMessage = $e->getMessage(); 
}

// $errorMessage can only be other than false from the exception catch block above
if ($errorMessage !== false) {
    exit($errorMessage);
}

关于php - 带有 ErrorException 的控制台命令退出我的脚本,而不是在发生错误后继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640395/

相关文章:

php - 在 WordPress 中显示上次登录

php - sql中的if/Else/Else if/语句

json - 如何在 Blade View 中显示 JSON 数组?

php - 将 Java 中的 RSA 公钥发送到 PHP 服务器

php - 如何从 MySQL 中的文本区域插入多行

javascript - 如何从许多 <p> 中获取特定值

php - OctoberCMS 和 MySQL 的用户记录所有权

php - Laravel Remote/SSH 捕获 SSH2 异常

java - 使用java代码生成的公钥的格式

php - 使用 Laravel 显示博客文章摘录