2009-04-19 49 views
4

我已經與這個函數在下面討論,我想知道這是使用try/catch錯誤處理的正確方法。正確的方式使用拋出嘗試捕獲錯誤處理

public function execute() 
{ 
    $lbReturn = false; 
    $lsQuery = $this->msLastQuery; 
    try 
    { 
     $lrResource = mysql_query($lsQuery); 

     if(!$lrResource) 
     { 
      throw new MysqlException("Unable to execute query: ".$lsQuery); 
     } 
     else 
     { 
      $this->mrQueryResource = $lrResource; 
      $lbReturn = true; 
     } 

    } 
    catch(MysqlException $errorMsg) 
    { 
     ErrorHandler::handleException($errorMsg); 
    } 
    return $lbReturn; 
} 
+0

看看代碼,我會說這個函數的作者只拋出異常,以便他可以使用已經存在的日誌記錄功能來記錄它。 – 2009-04-19 10:34:55

回答

5

Codewise它是正確的/ works,但是try-catch的強大之處在於,當從你內部調用的某個函數中深度拋出Exception時。
由於「停止執行中間函數並一直跳回到catch塊」。

在這種情況下,有沒有深跌的異常,因此我會寫這樣的:
(假設有一個函數「handleErrorMessage」中的ErrorHandler)

public function execute() { 
    $lsQuery = $this->msLastQuery; 
    $lrResource = mysql_query($lsQuery); 

    if(!$lrResource) { 
     ErrorHandler::handleErrorMessage("Unable to execute query: ".$lsQuery); 
     return false; 
    } 
    $this->mrQueryResource = $lrResource; 
    return true; 
} 

我覺得這更易讀。

+0

感謝您的評論。 如果我將替換ErrorHandler :: handleErrorMessage($ errorMsg);用throw語句? 這是不正確的? – sanders 2009-04-19 12:11:27

5

沒有。在這種情況下拋出異常只是一個GOTO,但帶有一個(稍微)漂亮的臉。

+1

爲什麼downvote? – 2009-04-19 10:31:23

0

嗯,它是不是一個很好的實現,因爲你拋出異常,你在捕獲尋找異常。所以Visage的答案是真實的。

  1. 您應該使用全局錯誤處理程序,而不是像代碼中那樣使用tr-catch用法。
  2. 如果您不確定錯誤和發生的類型,但是想要繼續執行代碼(雖然發生了異常),那麼try-catch塊會有所幫助。
1

爲什麼要在這裏調用ErrorHandler :: handleException呢?

只拋出異常,但從來沒有抓住它。然後,在你的應用程序中的全局初始化代碼必須具有以下簽名的函數:

function catchAllExceptions(Exception $e) 

然後調用:

set_exception_handler('catchAllExceptions'); 

這將導致所有未捕獲的excpetions以作爲參數傳遞給catchAllExceptions傳遞() 。像這樣在一個地方處理所有未捕獲的異常是很好的,因爲你減少了代碼複製。