2010-01-25 46 views

回答

63

當然,正好趕上要繼續執行異常...

try 
    { 
     SomeOperation(); 
    } 
    catch (SomeException $e) 
    { 
     // do nothing... php will ignore and continue  
    } 

當然,這有默默下降,這可能是一個非常重要的錯誤的問題。 SomeOperation()可能會失敗,導致其他細微的難以解決的問題,但是你永遠不會知道你是否默默地放棄了異常。

+0

嘎!擊敗我21秒。 – 2010-01-25 14:12:05

+4

如果我可能會添加:在catch塊中沒有做任何事情的情況下捕獲一個異常被認爲是不好的風格,那麼你至少應該寫一些日誌輸出(或者,如在示例中,提供一個評論,確實,真的,真的沒有必要完成)。如果您捕獲_any_異常並且catch(Exception $ ex){} – dbemerlin 2010-01-25 14:13:25

+1

,那麼尤其如此,那麼如何記錄它並仍然繼續? – numerical25 2013-02-11 14:18:14

13

肯定的:

try { 
    throw new Exception('Something bad'); 
} catch (Exception $e) { 
    // Do nothing 
} 

你可能想去有PHP文檔的讀取上Exceptions

+3

+1爲建議閱讀手冊。 – GZipp 2010-01-25 14:42:34

+0

這將拋出一個新的異常現在被try塊捕獲,導致未捕獲異常 – 2013-03-17 10:41:09

+1

@JakeN不正確。由於拋出的異常被'catch'塊捕獲,它可以**不會**導致未捕獲的異常。 – Pere 2015-05-28 16:29:41

5

是的。

try { 
    Somecode(); 
catch (Exception $e) { 
    // handle or ignore exception here. 
} 

但是請注意,PHP也有錯誤代碼從異常分開,遺留以前的PHP有oop原語。大多數庫buildin仍然會產生錯誤代碼,而不是例外。要忽略錯誤代碼調用該函數帶有前綴@:

@myfunction(); 
98

是的,但是這取決於你想執行什麼:

例如

try { 
    a(); 
    b(); 
} 
catch(Exception $e){ 
} 

c(); 

c()將始終執行。但如果a()引發異常,b()而不是執行。

只把東西放在相互依賴的try塊中。例如。 b取決於a的一些結果,在try-catch塊之後放b是沒有意義的。

+0

如果我有剩下的選票,我會把它放在這個... :) – 2010-01-25 15:30:28

+0

我代表你做了:) – 2015-11-05 08:02:33

+2

'$ e'需要是'\ Exception $ e'或simular或解析錯誤拋出 – iautomation 2016-03-01 21:29:38

0

另一個角度是從處理代碼返回一個異常,而不是拋出一個異常。

我需要用我正在編寫的模板框架來做到這一點。如果用戶嘗試訪問數據中不存在的屬性,則我將返回處理函數內部深處的錯誤,而不是拋出它。

然後,在調用代碼,我可以決定是否拋出這個返回的錯誤,導致了嘗試()趕上(),或者只是繼續:

// process the template 
    try 
    { 
     // this function will pass back a value, or a TemplateExecption if invalid 
      $result = $this->process($value); 

     // if the result is an error, choose what to do with it 
      if($result instanceof TemplateExecption) 
      { 
       if(DEBUGGING == TRUE) 
       { 
        throw($result); // throw the original error 
       } 
       else 
       { 
        $result = NULL; // ignore the error 
       } 
      } 
    } 

// catch TemplateExceptions 
    catch(TemplateException $e) 
    { 
     // handle template exceptions 
    } 

// catch normal PHP Exceptions 
    catch(Exception $e) 
    { 
     // handle normal exceptions 
    } 

// if we get here, $result was valid, or ignored 
    return $result; 

這樣做的結果是我仍然得到原始錯誤的上下文,即使它被放在最上面。

另一個選擇可能是返回一個自定義的NullObject或一個UnknownProperty對象,並在決定跳過catch()之前進行比較,但是因爲您可以重新拋出錯誤,並且如果完全控制了總體結構,我認爲這是一個乾淨利落的問題,無法繼續嘗試/捕捉。

0

一個古老的問題,但我曾經從VBA scipt轉到php,在那裏你可以讓我們「去」重新進入一個循環「On Error」與一個「簡歷」並離開它去了仍在處理該功能。
在php中,經過一些試驗和錯誤之後,我現在使用嵌套try {} catch {}來處理關鍵和非關鍵的流程,甚至是相互依賴的類調用,這樣我就可以追溯到錯誤的開始。 例如如果函數B依賴於功能,但功能c是不錯的,但不應該停止的過程中,我還是想知道的所有3不顧後果,這是我做的:

//set up array to capture output of all 3 functions 
$resultArr = array(array(), array(), array()); 

// Loop through the primary array and run the functions 
foreach($x as $key => $val) 
{ 
    try 
    { 
     $resultArr[$key][0][] = a($key); 
     $resultArr[$key][1][] = b($val); 
     try 
     { // If successful, output of c() is captured 
      $resultArr[$key][2][] = c($key, $val); 
     } 
     catch(Exception $ex) 
     { // If an error, capture why c() failed 
      $resultArr[$key][2][] = $ex->getMessage(); 
     } 
    } 
    catch(Exception $ex) 
    { // If critical functions a() or b() fail, we catch the reason why 
     $criticalError = $ex->getMessage(); 
    } 
} 

現在我可以遍歷每個鍵的結果數組並評估結果。 如果()或b()存在嚴重故障。
在$ resultArr發生嚴重故障之前,我還有一個參考點,如果異常處理程序設置正確,我知道它是否是()或b()失敗。
如果c()失敗,循環繼續。如果c()在各個點失敗了,再加上一些額外的後循環邏輯,我甚至可以通過詢問$ resultArr [$ key] [2]來發現c()是否工作或每次迭代都有錯誤。