2011-03-24 139 views
5

所以我剛剛讀了Why to never use 'or die'.如何優雅地死去?

我更加困惑,然後永遠。我正在驗證一個複雜的表單,並且我去了if語句的許多嵌套級別,而不是和我將變量傳遞給名爲$ status的表單,該表單只能是「新建」或「編輯」。然後,當用戶提交要再次驗證的表單時,表單將作爲隱藏字段($ _POST)傳遞$ status值。我想確保用戶不會意外地改變這一點,所以如果我想通過'new'或'edit'之外的其他東西傳遞錯誤,我想要捕獲錯誤。 (雖然我想完全消除影響在一個理想的世界中,這變量的用戶的可能性。)

所以我想,我會使用if語句DIE()在

<nested ifs> 
    Select ($status){ 
     Case 'edit': 
      break; 
     Case 'new': 
      break; 
     default: 
      //using example from article 
      trigger_error("An error that should not occur has occurred", E_USER_ERROR); 
      break; 
    } 
</nested ifs> 

我不我真的明白這比死()更清潔嗎?本質上,我想調用另一個函數,它顯示用戶在這個時候可以做些什麼來解決錯誤,但我希望代碼完全停止運行,因爲我不想讓if語句繼續下去以繼續解析當發現除「新」或「編輯」之外的任何內容併產生錯誤。

我不知道我有多清楚,所以請隨時請我詳細說明任何不清楚的要點。 (或更好的是,隱藏的用戶字段是否會被黑客攻擊?如何防止?:P)

+6

+1精彩的稱號。 – 2011-03-24 21:01:23

回答

6

trigger_error()觸發錯誤,該錯誤由錯誤處理程序處理。

隨着trigger_error()你可以優雅地處理錯誤,例如:

set_error_handler('ErrorHandler'); 

    function ErrorHandler($errno, $errmsg, $filename, $linenum, $vars) 
    { 
    print '<pre style="line-height: 2em;">'; 
    printf("==> Error in `%s' line %s: %s\n\n", $filename, $linenum, $errmsg); 
    debug_print_backtrace(); 
    print '</pre>'; 

    exit($errno); 
    } 

這是一個簡單的例子,但我們公司的網站顯示一個友好的錯誤頁面,並把我說我是個白癡和混亂的電子郵件某處:-)

的優勢die()exit()應該清楚:-)

exit()當你需要退出仍可使用。例如,當您生成模板時,輸出該模板,並希望停止執行代碼。或者,當您發送一個header('Location: ...');標題並希望確保執行停止時...只是不要將其用於處理意外情況(即錯誤)。

trigger_error()也給你更好的控制程度。當您要執行停止但顯示通知時,您可以發送E_USER_NOTICE,當您要執行到時,您可以發送E_USER_ERROR停止

此外,你可以編寫更復雜的錯誤處理函數,其中一些IP看到錯誤,其餘的不會...... Kindda對開發很有用。

雖然過於複雜的錯誤處理程序是一個小心,但會發生錯誤處理程序內發生錯誤...?您可能已經看到啓:)

+0

trigger_error()在哪裏適合這個?觸發錯誤函數是否調用set_error_handler來調用ErrorHandler? 順便說一下,我在讚歎地看着這段代碼:「OH so shiny」:D – Mallow 2011-03-24 20:59:26

+1

@Mallow:這正是發生的事情。關於'set_error_handler'的好處是你可以爲不同的(可處理的)錯誤類型設置多個處理程序。注意,某些錯誤無法處理,例如解析錯誤。 – Charles 2011-03-24 21:00:10

+0

這太棒了!您已完成缺失的鏈接。 – Mallow 2011-03-24 21:01:35

1

您鏈接到文章解釋了爲什麼你不應該使用or die,如:

$result = mysql_query($query) or die('A MySQL query occurred: ' . mysql_error()); 

顯然這是一個壞主意,因爲它可以輸出敏感信息關於你的MySQL結構給惡意用戶。

但是,我認爲沒有什麼不對(我認爲這篇文章的作者會同意我的說法)以您使用它的方式使用die,儘管向用戶提供一個選項列表,成爲處理這個問題的首選方式。

+0

啊,我懷疑這個'或死'是他的主要焦點,但我不想把我的手放在火裏。 – Mallow 2011-03-24 21:04:02