在學習中,越學習越覺得自己基礎薄弱。
在平常工作中,對於某些錯誤處理感覺不知道怎麼下手,於是決定重新再整理一下。
部分引用::再談php錯誤與異常處理
1、在 php 中,什麼是錯誤和異常處理?
在我的理解中。
只要是不符合程式預期的執行計畫,都是異常。
屬於編寫的問題,導致編譯器無法通過編譯。或者其他。是不能由 try-cache 捕捉的。
我的理解真的很淺,上面文章對這方面講解的很詳細。
2、錯誤的級別
這個問題引出了我今天為什麼要重新學習錯誤和異常處理的原因。
bool trigger_error ( string $error_msg [, int $error_type = e_user_notice ] )產生乙個使用者級別的 error/warning/notice 資訊
這個函式引出了錯誤級別的概念,我當時在想,什麼是使用者級別的錯誤?
這裡引出了錯誤級別的分類,先看看有哪些錯誤級別吧
fatal error:致命錯誤(指令碼終止執行)e_error // 致命的執行錯誤,錯誤無法恢復,暫停執行指令碼
e_core_error // php啟動時初始化過程中的致命錯誤
e_compile_error // 編譯時致命性錯,就像由zend指令碼引擎生成了乙個e_error
e_user_error // 自定義錯誤訊息。像用php函式trigger_error(錯誤型別設定為:e_user_error)
parse error:編譯時解析錯誤,語法錯誤(指令碼終止執行)
e_parse //編譯時的語法解析錯誤
warning error:警告錯誤(僅給出提示資訊,指令碼不終止執行)
e_warning // 執行時警告 (非致命錯誤)。
e_core_warning // php初始化啟動過程中發生的警告 (非致命錯誤) 。
e_compile_warning // 編譯警告
e_user_warning // 使用者產生的警告資訊
notice error:通知錯誤(僅給出通知資訊,指令碼不終止執行)
e_notice // 執行時通知。表示指令碼遇到可能會表現為錯誤的情況.
e_user_notice // 使用者產生的通知資訊。
這些報錯資訊均會在 log 中體現,這也就體現了我上面的問題。
什麼是使用者級別的報錯資訊。
就是使用者自定義了乙個致命錯誤。
知道這些的話,我們也就可以繼續往下走了。
3、php異常處理函式
這裡也是學習和記錄。
一:set_error_handler()
看一下官方對於他的解釋:設定使用者自定義的錯誤處理函式
也很好理解吧,就是定義乙個在發生錯誤處理的函式
mixed set_error_handler ( callable $error_handler [, int $error_types = e_all | e_strict ] )
但是注意:該函式只能捕獲系統產生的一些warning、notice級別的錯誤。
二:register_shutdown_function()
看一下官方對於他的解釋:
註冊乙個會在php中止時執行的函式
這個也從字面就可以理解,就是在 php 中止時呼叫的函式
void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )
但是注意,在測試時,單單乙個頁面的 php 是不會觸發錯誤的,必須通過 include/require 引入才能生效。
具體還是看大神的文章:問什麼不能觸發,為什麼框架中是可以的?
三:set_exception_handler()
看一下官方對於他的解釋:
設定預設的異常處理程式,用於沒有用 try/catch 塊來捕獲的異常。
callable set_exception_handler ( callable $exception_handler )
4、自定義處理函式和異常巢狀
在平常使用中,這個可能使用最多的了,因為之前在使用框架時候,這部分已經進行封裝,但是我們希望在對應時候有對應的處理機制,就會一直的擴充套件下去。
一:自定義異常處理
在複雜的系統中,我們往往需要自己捕獲我們需要特殊處理的異常,這些異常可能是特殊情況下丟擲的。所以我們就自己定義乙個異常捕獲類,該類必須是 exception 類的乙個擴充套件,該類繼承了 php 的 exception 類的所有屬性,並且我們可以新增自定義的函式,使用的時候其實和之前的一樣,大致寫法如下:
<?phpclass go extends exception
}try catch (go $e)
二:自定義異常處理
這裡借用大佬的一部分**,總的來說,就是可以巢狀多個 try-cache 在抓到錯誤時時,分層傳遞異常。
注意:在有多個異常時,會優先處理第乙個異常
<?phpclass zyfexception extends exception
}$age = 1000;
try
// if ($age <= 0)
} catch (zyfexception $e) catch(exception $e)
?>
關於異常和錯誤今天就寫到著了,感覺真的,大佬寫的很好,很受益。
同時感到了自己的不明白,更應該多學習。
PHP之記錄錯誤日誌
在開發階段,需要顯示所有錯誤 而在產品階段,則需要隱藏所有錯誤並記錄所有錯誤 同樣記錄錯誤有兩種方式 在php.ini中 log errors on off 設定是否記錄日誌 errors log log 設定錯誤日誌檔名,若沒有給定路徑,則在所有目錄下生成日誌檔案 error log syslog...
PHP錯誤與異常處理
和其他程式語言遇到錯誤就丟擲異常不一樣,php在處理物件時它也有異常機制,但是php會盡可能的愉快的去執行而無視發生的事情,除非遇到乙個極端嚴重錯誤才會丟擲異常。本文概述php相關的錯誤異常處理機制。錯誤等級 php 有幾個錯誤嚴重性等級。三個最常見的的資訊型別是錯誤 error 通知 notice...
php基礎之錯誤處理
php中,將各種錯誤進行了不同級別的劃分,大約有十多個級別,這就是技術層面的錯誤分級。每個級別的錯誤都有相應代號,就是系統內部定義的乙個常量。常見的錯誤級別有如下幾種 echo 系統常見錯誤 echo e error e error t t其對於的二進位制值為 getbinstr e error e...