2018 05 02 PHP 之錯誤與異常處理

2022-05-02 09:12:12 字數 3092 閱讀 1576

在學習中,越學習越覺得自己基礎薄弱。

在平常工作中,對於某些錯誤處理感覺不知道怎麼下手,於是決定重新再整理一下。

部分引用::再談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 類的所有屬性,並且我們可以新增自定義的函式,使用的時候其實和之前的一樣,大致寫法如下:

<?php

class go extends exception

}try catch (go $e)

二:自定義異常處理

這裡借用大佬的一部分**,總的來說,就是可以巢狀多個 try-cache 在抓到錯誤時時,分層傳遞異常。

注意:在有多個異常時,會優先處理第乙個異常

<?php

class 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...