我刚刚从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");
}
}
答案 0 :(得分:1)
要在脚本中使用内联异常,请使用try...catch
块:
try {
$value = someFunctionThatMayCauseAnException();
} catch (Exception $e) {
$errorMessage = $e->getMessage();
}
有关更多信息,请参阅Exceptions
的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);
}
答案 1 :(得分:0)
解决了它。我试了一下我修改过的。
确保catch
有一个向后的斜杠:
try {
//code here
} catch (\Exception $e) {
print_r($e->getMessage());
}