出现错误异常的控制台命令退出我的脚本,而不是在出现错误后继续


Console Commands with ErrorException exit my script instead of continuing after an error

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

4.2:Cannot connect to xyz.IP Error 60. Operation timed out

5.0:[ErrorException] Cannot connect to xyz.IP Error 60. Operation timed out

有关更多上下文:我正在使用该脚本将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块:

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

有关更多信息,请参阅异常的PHP手册条目

"未捕获"异常将停止脚本。有时候,这就是想要的效果。例如,您使用的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);
}

解决了它。我修改了一个try-catch。

确保catch有一个像这样的后斜杠:

try {
    //code here
} catch ('Exception $e) {
    print_r($e->getMessage());
}