2010-10-26 141 views
3

這是一個非常基本的問題(我希望)。我所做的大多數異常處理都是在c#中完成的。在c#中,try catch塊中出錯的任何代碼都由catch代碼處理。例如,PHP異常處理vs C#

try 
{ 
int divByZero=45/0; 
} 
catch(Exception ex) 
{ 
errorCode.text=ex.message(); 
} 

錯誤將顯示在errorCode.text中。如果我嘗試在php中運行相同的代碼,但是:

try{ 
    $divByZero=45/0; 
    } 
catch(Exception ex) 
{ 
    echo ex->getMessage(); 
} 

catch代碼未運行。基於我的習慣理解,php需要一個提示。這是否不符合錯誤檢查的整個目的?這不會減少if then語句的try catch嗎? 如果(除以零)拋出錯誤 請告訴我,我不必在拋出嘗試抓住每個可能的錯誤。如果我這樣做,是否有任何使php的錯誤處理行爲更像c#?

+0

對不起,如果格式化是關閉,試圖解決它。 – CountMurphy 2010-10-26 01:15:35

+0

零除產生一個警告,而不是一個例外 - 這解釋了這一點。 – JAL 2010-10-26 01:27:01

回答

6

您也可以將您的所有PHP錯誤與set_error_handler()ErrorException到異常:

function exception_error_handler($errno, $errstr, $errfile, $errline) 
{ 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 
set_error_handler("exception_error_handler"); 

try { 
    $a = 1/0; 
} catch (ErrorException $e) { 
    echo $e->getMessage(); 
} 
+0

這工作太棒了!謝謝。 – CountMurphy 2010-10-26 01:35:59

+0

這會處理所有的警告,或只是實際的錯誤? – CountMurphy 2010-10-26 01:37:40

+0

@CountMurphy:任何可捕捉的PHP錯誤,警告,通知等。 – zerkms 2010-10-26 01:40:43

1

我認爲處理這個在PHP中唯一的辦法就是寫:

try 
{ 
    if ($b == 0) throw new Exception('Division by zero.'); 
    $divByZero = $a/$b; 
} 
catch(Exception ex) 
{ 
    echo ex->getMessage(); 
} 

不像在C#中,並非每一個問題將提高在PHP異常。有些問題會被默默地忽略(或者不是默默地 - 它們會將輸出內容打印出來),但還有其他方法可以處理這些問題。我想這是因爲從第一個版本開始,異常不是語言的一部分,所以有一些「遺留」機制。

+0

當它。我以前很怕那個。這似乎...可怕地gimped – CountMurphy 2010-10-26 01:21:56

2

PHP的的try-catch後來在語言的生活中實現,因此它僅適用於用戶定義的異常。

如果你真的想處理實際的錯誤,set your own error handler

定義和捕捉異常

function oops($a) 
{ 
    if (!$a) { 
     throw new Exception('empty variable'); 
    } 
    return "oops, $a"; 
} 

try { 
    print oops($b); 
} catch (Exception $e) { 
    print "Error occurred: " . $e->getMessage(); 
}