2011-03-24 150 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