2011-01-11 148 views
4

我目前正在使用register_shutdown_function()來達到多種目的。一個用於處理致命錯誤,另一個用於記錄在執行期間使用的資源,如時間,存儲空間等。register_shutdown_function() - 什麼是最佳實踐?

目前我註冊了兩個不同的關閉函數,但是在一次測試中,只有第一次運行,而另一次似乎失敗。現在,這可能是由函數本身內部的一些錯誤觸發的,所以我重寫了它,但可能是因爲使用多個register_shutdown_function調用而導致錯誤?那麼在這裏,最好的做法是註冊兩個不同的函數,或者只是調用一個函數來處理不同的任務?

如果發生致命錯誤或者是否應該將函數保留在函數本身中,是否也安全(並且有可能)使函數加載錯誤處理類?

我得到的最後一個問題是,如果有比使用關閉函數更好的方法來處理致命錯誤?我嘗試過使用set_error_handler,但它沒有覆蓋所有errortypes,所以一些錯誤不會觸發這個。

希望這些問題能夠很好地闡明和清晰。我的目標是儘可能保持代碼的可靠性,並且我找不到任何正確的答案。

*編輯:找到我的第一個問題的答案,註冊幾個函數應該沒有問題,所以錯誤必須在函數本身。留下問題以獲得答案,以確定是否有更好的方法來處理致命錯誤。

回答

2

IIRC,如果您有多個註冊的關機功能,它們將按註冊順序執行;你不應該有任何退出語句,否則後續的關閉功能將不會運行。這意味着如果您有多個功能而不是單個關機功能,則需要非常小心。但是,如果您將不同的參數傳遞給不同的函數,那麼在設置所有適當的變量之前調用函數(可能是由錯誤觸發)的情況下,應該確保它們都具有默認值。

就我個人而言,我註冊了多個功能,爲了類似的目的,但我非常小心他們的邏輯和註冊的順序。

這也不是一個好主意,用包括或關閉功能(特別是在一個異常處理程序)類似,以防包括本身引發的異常

+0

感謝馬克:)我會避免使用類或者在關機功能中包含任何其他內容。可能是一個意外退出()或死()導致我的問題與第二個功能不執行。已經重寫了代碼,所以現在它已經100%正常工作。給予你+1正確的答案,覆蓋我的問題的主要部分,並給出一個很好的答案:D – Sondre 2011-01-11 12:56:10