php異常處理機制

php異常咱們常接觸到的就是error錯誤碼1,warning錯誤碼2,notice錯誤碼8這三類。出現error了系統是掛掉了,可是warning和notice是咱們能夠捕捉並處理的php

 

php配置項
display_errors=On On將錯誤顯示到瀏覽器上,無論是On仍是Off都會記錄到你錯誤日誌裏面,前提是配置了錯誤日誌log_errors和error_logmysql

error_reporting 設置錯誤報告級別,這個與display_errors和error_log有關,只會將對應的錯誤記錄在錯誤日誌或者打印到瀏覽器上sql


php錯誤處理機制
php自己有一套錯誤處理機制,就是經過display_errors error_reporting來控制
因此默認狀況下,在代碼出現問題,notice warning等消息時,會直接打印到瀏覽器上,並且還會繼續往下執行,這個時候你經過 try catch根本捕捉不到,這就和我理解的不太同樣,
由於我覺得的會是錯誤直接被我catch捕捉到,瀏覽器

因此php的try catch 能捕捉到的只能是你本身 throw new Exception("");的錯誤,throw以後的語句會進入到catch中繼續執行。函數

若是你想拋棄php自身的錯誤處理機制,這個時候能夠經過set_error_handler這個函數,自定義一個函數用來處理,再這個函數中你能夠拋出異常,而後再經過catch捕捉到異常。3d


這樣的意義就是,當出現notice和warning時,好比在mysql鏈接失敗時,會出現warning,可是這個warning你又不能直接經過catch捕捉到,不考慮關閉display_errors,
而後設置error_reporting,經過判斷connect返回的句柄,來手動throw拋出異常日誌

 

set_error_handler()也不能用來處理全部的錯誤級別,官方手冊上是這樣說的:blog

The following error types cannot be handled with a user defined function: 
E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, 
and most of E_STRICT raised in the file where set_error_handler() is called.字符串

 

最後再提供一個小技巧,對於須要使用第三方類的時候能夠考慮這樣子it

 

1.經過__call()方法,這樣作的好處就是避免了,再使用沒有定義的方法的時候,會報error的錯誤,error是會讓整個系統掛掉的。

2.第二個方面配合set_error_handler()方法設置的自定義錯誤處理函數,就至關於在調用函數方法的過程當中就已經封裝了異常處理,咱們只須要判斷函數處理結果是false(或者是其餘的一個字符串)就行了。能夠用來判斷函數是否調用失敗,好比connect。

 

還有一點須要注意的是,php throw出來的異常,必需要catch到,否則會報錯。php的異常也像JAVA的異常的同樣,能夠在最外層catch捕捉,也能夠在throw的地方捕捉。

相關文章
相關標籤/搜索