2010-02-21 48 views
3

我是PHP新手,所以我很抱歉,如果這看起來很愚蠢。我搜索了四周,找不到任何具體解釋我在找什麼的東西。PHP:錯誤處理的控制流程是什麼?

最終我有兩個目標。

  1. 在生產中,當發生意外錯誤時,向用戶顯示默認的「oops」頁面。
  2. 當發生預期的錯誤時,處理它而不會PHP死亡。

我的PHP錯誤處理的思維模型足以讓我無法自信地前進,並且我一直無法找到任何有關此過程的良好文檔。

給一些人爲的例子。

  1. 用戶發出請求,連接到數據庫失敗,我們顯示一個oops消息。
  2. 用戶發出請求,腳本不能正確解析,我們會顯示oops消息。
  3. 用戶發出請求,我們用樂觀鎖定的更新來查詢數據庫。它失敗了,所以我們通知用戶該對象已被更新。

我認爲我的大部分困惑都是圍繞着什麼樣的錯誤導致腳本死亡,哪些錯誤不會(使用默認處理程序)以及腳本何時死亡,我們如何優雅地通知用戶?

另外,做任何標準的php函數/對象使用異常?如果我選擇以更多的C風格處理異常,我是否會對我的任何一點感到驚訝?這是否會在PHP6中改變?如果是這樣,我會努力討論使用c風格和異常之間的差異,但如果不是,我寧願只在整個PHP5中一直使用c風格。除非我絕對需要,否則這不是我想解決的問題。

編輯: 我剛剛意識到內容並不完全符合標題。我想知道,發生錯誤時,PHP的邏輯流程是什麼?這樣我可以更好地理解如何實現我在PHP中的錯誤處理方面的目標。

回答

3

大部分內置在tuff中的PHP都會觸發您在默認設置中無法處理的錯誤。

但是,您可以通過設置自定義錯誤處理程序並拋出異常而不是錯誤來解決此問題。 (在可能的情況下,PHP會在內部處理錯誤之前運行您的處理程序,因此您可以以正常方式捕獲異常。)

我已經寫了一堆代碼,你可以在我的答案在這裏使用了這樣的情況: PHP: exceptions vs errors?

如果PHP不能真正分析您的文件你幾乎擰,PHP將很崩潰在大多數情況下,它無法解析文件。儘管你可以在包含它之前嘗試編寫自己的包含函數eval的一個文件,如果eval失敗,就跳過。你需要確保你基本上可以信任這些文件。

+0

PHP的內部錯誤處理程序何時會終止腳本? – Fred 2010-02-21 17:33:03

+0

當一個不可恢復的錯誤被觸發(E_ERROR)_並且沒有用戶定義的處理程序可以正常處理它。如果E_PARSE在當前執行行中被觸發,則會終止解釋器(因此不在實際使用的某個函數內)。有關更多信息,請參見http://www.php.net/manual/en/errorfunc.constants.php。 – Kris 2010-02-21 18:21:53

+0

謝謝克里斯,那正是我正在尋找的。我曾嘗試儘早找到這些信息並失敗。 這聽起來好像我可以成立一個E_ERROR一個處理程序,並把它轉到一個oops頁面,然後用trigger_error()觸發了另一個處理程序E_USER_ERROR這也將進入「糟糕」頁面,其他不可恢復的條件如無法連接到數據庫。 根據文檔,E_USER_ERROR「就像E_ERROR」一樣。如果默認錯誤處理程序獲取它,我認爲它會像E_ERROR一樣終止腳本。 – Fred 2010-02-22 03:33:53

0

例外很好地集成到PHP5。它們具有與Java/C++例外相同的try/catch語法。發生預期錯誤時使用它們。

如果你想顯示自定義「哎呀」頁面,您可以結合使用set_exception_handlertrigger_error。有關更多提示,請考慮使用this鏈接。

+0

哪一個在解析錯誤的情況下不起作用。 這不是我要找的。 – Fred 2010-02-21 17:31:55