我相信,在正確編碼的系統中 - 錯誤(作爲錯誤或異常)不應該是可能的(除了DB/memcached服務器關閉導致查詢失敗)。我們的守則不應該依賴任何假設來正確工作,並且應該儘可能地防患於未然。然而,爲了確保我們的系統以最友好的方式處理問題,我們必須構建並實施某種「捕獲系統」,以確保如果出現任何問題,我們的服務人員和最終用戶將得到照顧。PHP異常真的比錯誤更有用嗎? (Adv)
爲此,PHP提供了兩種解決方案 - 錯誤和例外。錯誤由5個值組成,而Exceptions由包含在對象中的5個值組成。兩者都允許在應用程序構建時具有無價之寶。
5個值爲$ ERROR_CODE, $ ERROR_MESSAGE,$文件,$線,$背景
通常情況下,在我們爭取適當的OOP編程的默認選擇始終追求的對象 - 但在這樣的情況下,我不確定他們真的是多麼有益。通過使用異常,添加內存被浪費在需要將值包裝在對象中(這通常還需要包含異常類的額外文件)。此外,您必須在TRY/CATCH塊中包裝任何您認爲可能失敗的代碼。這使得錯誤處理方法對於人爲錯誤是開放的,因爲開發人員可能不會覆蓋失敗點。爲了安全防範這種情況,您可以使用set_exception_handler,它將傳遞任何未捕獲的異常。異常處理程序的壞處在於執行會在調用exception_handler後停止 - 因此,如果不能在try/catch塊中捕獲異常,則不存在可恢復/忽略的異常。
另一方面,錯誤總是全局的,可以由set_error_handler設置的任何函數/類來處理。這消除了額外的異常類,對象內存或try/catch代碼行的需要。像例外情況一樣,錯誤代碼也可以通過內置錯誤代碼來實現(與例外情況不同),您可以使用這些代碼繼續執行腳本以執行輕微或不重要的腳本問題。另外,大多數PHP函數都會觸發錯誤,所以不會違背語言的流程。
因此,既然您必須支持錯誤處理(對PHP語言做),那麼浪費額外代碼和內存的目的是什麼也實現異常?我們是否盲目地這麼做,是因爲它在對象形式上是錯誤的,還是在應用程序設計中有一個真正的好處,那就是正常的錯誤不能提供給我們?
這不完全正確。假設你有一些函數'A'和'B',其中'A'用值'C'調用'B',可以拋開語義上的爭論。 ''C'可能不適合與'B'一起使用 - 因此,使用你的定義是一個*錯誤*,一個「代碼中的邏輯謬誤」。但錯誤不在'B'函數中,它在函數'C'到'B' - 函數'A'中。那麼怎麼能'B'發信號給'A',說明'A'有錯誤?或者,根據你的代碼,'B'怎麼可以給'Z',那個叫'A'的函數,'A'有錯誤?這是一個例外。 – 2009-10-26 20:41:26
這聽起來沒問題,但是'A'沒有編程以將正確的數據類型傳遞給'B'並不是一個例外 - 這是一個「代碼中的謬誤」。應該正確地重寫A'以遵守'B'設定的標準。現在如果'A'無法知道'B'想要什麼 - 那將是一個例外。 – Xeoncross 2009-10-30 22:31:04