我刚刚从 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/