2015-11-10 19 views
2

我剛剛從4.2升級到5.0。我得到了我所有的命令,但我注意到在一個腳本中,我看到一個報告錯誤(預期錯誤)的錯誤。問題是,它打破了我的腳本繼續而不是繼續在foreach循環中的下一步。 4.2上相同腳本的錯誤將報告錯誤並繼續。帶有ErrorException的控制檯命令退出我的腳本,而不是在出錯後繼續

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

回答

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); 
} 
+0

我解決它。我原來的代碼確實有try/catch塊,但我在這裏省略了它。問題真的很蠢。我的try catch使用catch(Exception $ e)',但我需要的是catch(\ Exception $ e)'。注意斜槓。看到另一個線程,嘗試它,它的工作。錯誤仍然存​​在,但腳本繼續,這是我所需要的。 – Envious

+0

斜槓是用於命名空間的,在本例中是根或全局命名空間,是的,如果您在另一個命名空間並且沒有導入根異常類,則必須爲Exception類使用正確的名稱空間名稱。至於已經嘗試...catch,這是你的示例代碼中遺漏的一個奇怪的東西,而你的問題陳述完全沒有提及這個 - 事實上,問題陳述表明沒有捕獲異常,這就是我發佈這個答案的原因。你們浪費了我的時間,錯誤地表達了你的問題:/ –

0

解決它。我嘗試了一下我修改過的嘗試。

確保catch有這樣的向後斜線:

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

只有當你不在根名稱空間中時,這並不總是如此,並且取決於使用語句。 –