2009-07-04 76 views
5

最近我一直在使用Exceptions。我認爲記錄未捕獲的異常是有意義的,因爲它極大地幫助開發人員通過查看異常日誌來解決源代碼中可能出現的問題。但是,如果處理異常,是否需要再次登錄?是的,在一定程度上。如果您的代碼中存在錯誤的「壞」開發人員,那麼通過簡單地捕獲異常將會使這些錯誤「消失」。例如:記錄捕獲和未捕獲的異常?

try 
{ 
fopen('/path/to/file','w'); 
} 
catch (Exception $e) 
{ 
// Display an error to user 
} 

上面的代碼是PHP。關鍵是,這種代碼imo不應該存在。例外情況意味着特殊情況並且很少發生,但是通過這些代碼,它們發生得比較少。例如,開發者不檢查文件是否存在,也不檢查他是否有權寫入。相反,它應該是:

try 
{ 
if (file_exists('/path/to/file') && is_writable('/path/to/file')) 
    fopen('/path/to/file','w'); 
else 
    // Display an error to user about file not existing or not being writable 
} 
catch (Exception $e) 
{ 
// Display an error to user about an unexpected error 
} 

這樣做現在非常有意義。只有在例外情況下(例如服務器崩潰,停電等)纔會拋出異常。但是如果開發人員對所有事情都使用Exceptions並且省略了檢查 - 那麼我是否有辦法記錄捕獲到的異常?

我不希望開發人員將所有內容放在try-catch塊中以「解決」問題。我希望他們明確地檢查任何他們應該檢查 - 離開例外像硬件故障,服務器崩潰等異常情況

回答

1

我不認爲有一種神奇的方法類型的方法,如果這就是你要找的。但是否有可能將您的整個應用程序包裝在try... catch...結構中?根據定義,任何例外達到最外層try... catch...都未被捕獲......或者我錯過了這一點;-)

+2

set_exception_handler(http://www.php.net/manual/en/function.set-exception-handler.php) – troelskn 2009-07-04 15:28:31

12

例外意味着是例外,很少發生,但與此代碼,他們出現超過很少。

我認爲這是一種誤解。例外的地方是將理想流程與錯誤處理流程分開。

+0

例外例外 – 2013-08-08 07:59:36

0

我同意troelskn的評論,您應該只是將異常作爲強化代碼的有效方法。

如果你仍然想記錄未捕獲的異常,你必須讓所有的開發人員將它們傳遞給日誌記錄功能(例如,log_exception($e)),或者將它們全部捕獲到高級try/catch中並將它們記錄在那裏。您也可以使用像PHP_CodeSniffer這樣的工具來檢測與第一個示例類似的代碼,但這不是一個好的解決方案。你需要編寫自己的嗅探來檢測這種情況;它可能會查找不包含任何if語句的try塊。

6

您可以使用PHP的set_exception_handler函數,這會讓您提供一個捕獲所有未捕獲的異常的函數,但是您必須爲腳本中捕獲的所有那些添加手動日誌記錄。