2013-06-12 33 views
8

這個問題是關於對try塊外運行的代碼只有在沒有拋出異常的最好的辦法乾淨的方法只有在沒有拋出異常

try { 
    //experiment 
    //can't put code after experiment because I don't want a possible exception from this code to be caught by the following catch. It needs to bubble. 
} catch(Exception $explosion) { 
    //contain the blast 
} finally { 
    //cleanup 
    //this is not the answer since it executes even if an exception occured 
    //finally will be available in php 5.5 
} else { 
    //code to be executed only if no exception was thrown 
    //but no try ... else block exists in php 
} 

這方法通過@webbiedave響應於問題php try .. else建議。我發現它不令人滿意,因爲使用了額外的$caught變量。

$caught = false; 

try { 
    // something 
} catch (Exception $e) { 
    $caught = true; 
} 

if (!$caught) { 

} 

那麼什麼是更好的(或最好的)方式來完成這個,而不需要額外的變量呢?

+1

把它放在try塊。如果它可能拋出另一個你不想被外部try塊捕獲的異常,那麼使用一個嵌套的try-catch來捕獲該異常。但請注意,您不會將異常用作流量控制。 – ssube

+0

@peachykeen這將無法正常工作,因爲異常需要冒泡。 –

+2

聽起來很像你使用異常來控制執行過多。你確定你需要扔磚塊和後面的冒泡嗎?很可能的是,例外*應該被變量和適當的流量控制所取代。 – ssube

回答

4

一種可能性是把try塊的方法,如果有異常回報毫無遺漏的錯誤。

function myFunction() { 
    try { 
     // Code that throws an exception 
    } catch(Exception $e) { 
     return false; 
    } 
    return true; 
} 
+0

這可以通過try/catch來完成嗎? – Orangepill

+0

如果異常需要傳播,然後只是重新拋出它在捕獲 – Orangepill

+0

我更喜歡這個,因爲$ myFunctionResult變量將被賦值爲返回值myFunction()不會是完全任意的。 –

0

讓您的catch塊退出函數或(重新)拋出/拋出異常。你也可以過濾你的例外。所以如果你的其他代碼也拋出一個異常,你可以捕獲並重新拋出它。請記住:

  1. 如果未發現異常,則繼續執行。
  2. 如果發生異常而被牽制,而不是(重新)拋出或一個新的拋出。
  3. 你不會從catch塊中退出你的函數。
  4. 總是一個好主意(重新)拋出你不處理任何異常。
  5. 我們應該永遠是我們的異常處理的明確。這意味着如果你捕捉異常檢查我們可以處理任何事情的錯誤應該是(重新)拋出(n)

我會處理你的情況的方式是(重新)從第二條語句拋出異常。

try { 
    $this->throwExceptionA(); 
    $this->throwExceptionB(); 

} catch (Exception $e) { 
    if($e->getMessage() == "ExceptionA Message") { 
     //Do handle code 

    } elseif($e->getMessage() == "ExceptionB Message") { 
     //Do other clean-up 
     throw $e; 

    } else { 
     //We should always do this or we will create bugs that elude us because 
     //we are catching exception that we are not handling 
     throw $e; 
    } 
}