我刚刚从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());
}