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

时间:2015-11-10 21:56:00

标签: php laravel phpseclib

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

2 个答案:

答案 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());
}