依靠 die() 進行網站錯誤處理是不良的設計,因為它會導致網站使用者體驗不佳:頁面損壞,而且如果幸運的話,會出現對他們毫無幫助的錯誤訊息。就他們而言,當頁面損壞時,整個網站也可能損壞。
如果您希望大眾使用您的網站,請務必將其設計為能夠處理錯誤,並盡可能讓使用者繼續使用。如果網站真的故障了,請務必找出問題所在並修復它。單純使用 die() 無法做到這兩點。
如果超市的冷凍櫃壞了,想買冰淇淋的顧客並不會期望被趕出超市。
依靠 die() 進行網站錯誤處理是不良的設計,因為它會導致網站使用者體驗不佳:頁面損壞,而且如果幸運的話,會出現對他們毫無幫助的錯誤訊息。就他們而言,當頁面損壞時,整個網站也可能損壞。
如果您希望大眾使用您的網站,請務必將其設計為能夠處理錯誤,並盡可能讓使用者繼續使用。如果網站真的故障了,請務必找出問題所在並修復它。單純使用 die() 無法做到這兩點。
如果超市的冷凍櫃壞了,想買冰淇淋的顧客並不會期望被趕出超市。
請注意,在命令列使用 PHP 時,die("Error") 只會將 "Error" 輸出到 STDOUT,並以正常的 0 結束程式碼終止程式。
如果您希望遵循 UNIX CLI 程式的慣例,可以考慮以下做法
<?php
fwrite(STDERR, "發生錯誤。\n");
exit(1); // 非 0 的回應碼表示失敗
?>
這樣一來,當您將 STDOUT 導向至檔案時,您可以在控制台中看到錯誤訊息,而 BASH 腳本可以測試回應碼是否為 0 來判斷是否成功
rc@adl-dev-01:~$ php die.php > test
發生錯誤。
rc@adl-dev-01:~$ echo $?
1
理想情況下,PHP 會將所有警告、致命錯誤等寫入 STDERR,但那是另一回事了。
"... OR DIE..."
<?php
do_something($with_this) or die ('oops!');
?>
(在 PHP 中,「die」實際上是「exit」的別名)
請注意,雖然這經常被用作錯誤處理語句,但實際上並非如此... 它只是「or」布林運算子的重載(短路求值)。
它不會抑制任何錯誤訊息,也不會防止致命錯誤或程式當機,它不是「try/catch」的別名,而且可能會有不可預測的結果... 它的意思類似於這樣
- 正常執行第一個語句 ""do_something($with_this)""
-- 如果語句結果為 TRUE:則無需執行第二個語句,因此跳過它
-- 否則,如果返回 FALSE... 我不確定整個表達式的結果,因此繼續執行第二個語句 ""die('cuack!)""
因此,您不能依賴所有語句都會抑制錯誤訊息或程式當機,或者在發生錯誤或不良行為時總是返回「false」...
為此,最好使用錯誤抑制運算子「@」、「if」和「exit」指令,或使用「try/catch」區塊
我總是思考為什麼要存在重複的指令,但 `die()` 就是其中一個我知道原因的例子。它可能和 `exit()` 一樣,但是當你想在原始碼中搜尋 `die()` 來查找未處理的錯誤,而不是正常的 `exit()` 時,它對除錯會有些幫助。更不用說向後相容性了,但我們基於「正當」的理由不建議再使用這些舊方法。