2010-07-15 108 views
4

拋出新異常時,最好僅在沒有異常需要拋出時返回true。另外最好是返回false而不是拋出異常。我使用PHP。拋出異常和返回類型

回答

13

這一切都取決於你在做什麼。就個人而言,我用他們所有的時間,這樣我就不必檢查返回值(A愚蠢的,而是說明性的例子):

function ArrayToObject(array $array) { 
    $obj = new StdClass(); 
    foreach ($array as $key => $value) { 
     if (!is_string($key)) { 
      throw new Exception('Expects only string keys in the array'); 
     } 
     $obj->$key = $value; 
    } 
    return $obj; 
} 

這樣一來,我可以這樣做:

$array = array('foo' => 'bar'); 
try { 
    echo ArrayToObject($array)->foo; //Prints "bar" 
} catch (Exception $e) { 
    //Handle error here 
} 

它可以讓你不用擔心錯誤檢查你的結果。您可以在catch塊中正確處理錯誤。

所以,不,不會改變你要去基於例外返回什麼......讓例外處理錯誤,併爲你改變工作流程...

一個更真實的例子(以僞代碼):

try { 
    open database connection; 
    send query to database; 
    operate on results; 
} catch (DatabaseConnectionException $e) { 
    handle failed connection here; 
} catch (DatabaseQueryException $e) { 
    handle failed query here; 
} catch (Exception $e) { 
    handle any other errors here; 
} 

很顯然,這是假設你的數據庫函數/方法拋出這些異常...

0

這取決於你的函數的目的和回國的原因。 使用異常在錯誤/意外情況期間從函數返回。使用標準操作的返回值。

同樣,不要使用返回值來標記意外情況。如果你的函數 不會返回任何有意義的空指針引用,除以零,沒有數據連接,你應該拋出異常。一,它讓你用catch塊隔離你的錯誤處理代碼。二,它可以讓你提供更多的信息,爲什麼它失敗而不是'錯誤'。非常惱人的事情失敗時,所有的信息只是'錯誤'。

此外,您不想拋出異常作爲流量控制的替代方法。你可以變得富有創造性並且寫一個比較函數,如果它是平等的,它就什麼都不做,如果不相等則拋出一個GreaterThanException或LessThanException。但是,現在你已經失去了分離錯誤處理代碼的優勢(因爲標準處理代碼現在包含在catch塊中並且包含錯​​誤代碼)。另外,雖然我不確定在許多環境(如php)中執行異常處理的情況,但創建異常對象並對catch塊進行類型比較而非僅僅返回可能會更昂貴。