PHP中什麼是例外:
程式在運作中出現不符合預期的情況,允許發生(你也不想讓他出現不正常的情況)但他是一種不正常的情況,按照我們的正常邏輯本不該出的錯誤,但仍然會出現的錯誤,屬於邏輯和業務流程的錯誤,而不是編譯或語法上的錯誤。
PHP中什麼是錯誤:(推薦學習:PHP程式設計從入門到精通)
#屬於php腳本自身的問題,大部分情況是由錯誤的語法,伺服器環境導致,使得編譯器無法通過檢查,甚至無法運作的情況。 warning、notice都是錯誤,只是他們的等級不同而已,而且錯誤是不能被try-catch捕捉的。
上面的說法是有前提條件的:
在PHP中,因為在其他語言中就不能這樣下結論了,也就是說異常和錯誤的說法在不同的語言有不同的說法。
在PHP中任何自身的錯誤或是非正常的程式碼都會當做錯誤對待,並不會以異常的形式拋出,但是也有一些情況會當做異常和錯誤同時拋出(據說是,我沒有找到合適的例子)。
也就是說,你想在資料庫連線失敗的時候自動捕獲異常是行不通的,因為這就不是異常,是錯誤。但是在java中就不一樣了,他會把很多和預期不一致的行為當做異常來進行捕獲。
PHP異常處理很雞肋?
在上面的分析中我們可以看出,PHP並不能主動的拋出異常,但是你可以手動拋出異常,這就很無語了,如果你知道哪裡會出問題,你加入if else解決不就行了嗎,為啥還要手動拋出異常,既然能手動拋出就證明這個不是異常,而是意料之中。
以我的理解,這就是PHP異常處理雞肋的地方(不一定對啊)。所以PHP的異常機制不是那麼的完美,但是使用過框架的同學都知道有這個情況:你在框架中直接寫開頭那段php「自動」捕獲異常的程式碼是可以的,這是為什麼?
看過原始碼的同學都知道框架中都會涉及三個函數:register_shutdown_function,set_error_handler,set_exception_handler三個黑科技,透過這幾個函數我們可以實現PHP假自動捕獲異常和錯誤。
把錯誤以異常的形式拋出(不能完全拋出)
由上面的講解我們知道,php中的錯誤是不能以異常的像是捕獲的,但是我們需要讓他們拋出,已達到擴展try-catch的影響範圍,我們前面講到過set_error_handler() 方法,他是乾嘛用的,他是捕獲錯誤的,所以我們就可以藉助他來吧錯誤捕獲,然後再以異常的形式拋出,ok,試試下面的寫法:
<?php set_error_handler('error'); function error($type, $message, $file, $line) { throw new \Exception($message . '错误当做异常'); } $num = 0; try { echo 1/$num; } catch (Exception $e){ echo $e->getMessage(); } ?>
在php中最好不要簡單的在可能出錯的地方直接拋出異常,在一些框架中,重寫了上述的方法,異常和錯誤可以正常拋出
以上是php中錯誤訊息和異常訊息區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!