优雅地如何退出?

5

我刚刚阅读了为什么从不使用“or die”,但是更加困惑了。我正在验证一个复杂的表单,需要通过许多嵌套的if语句等进行处理。我传递一个名为$status的变量给表单,该变量只能是“new”或“edit”。然后,当用户提交表单以再次验证时,表单将$status值作为隐藏字段($_POST)传递。我希望确保用户不能意外更改此值,因此我希望捕获除“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>

我不太理解这种方法相对于die()更加干净的原因。本质上,我想调用另一个函数,该函数将向用户显示一些选项,让他们在此时修复错误,但我希望代码绝对停止运行,因为我不希望后面的if语句继续解析任何内容,并在发现除“new”或“edit”之外的内容时生成错误。
如果有任何不清楚的地方,请随时请问我澄清。 (或者更好的办法是,隐藏的用户字段是否会被黑客攻击?如何防止?: P)
2个回答

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会看到错误,而其他人则不会...对于开发而言非常有用。
但是要小心过于复杂的错误处理程序,如果错误处理程序内部发生错误会发生什么呢?你可能已经看过《盗梦空间》:)

触发trigger_error()函数的时机是什么?trigger_error()函数是否会调用set_error_handler(),然后再调用ErrorHandler?顺便说一下,我在欣赏这段代码:"哦,好闪亮" :D - Mallow
1
@Mallow:那确实是发生的情况。set_error_handler 的好处在于,您实际上可以为各种(可处理的)错误类型设置多个处理程序。注意,某些错误无法处理,例如解析错误。 - Charles
但是在 trigger_error 中的字符串会发生什么?它会消失吗?ErrorHandler() 从哪里获取它的参数? - Mallow
1
“Magic” :-) PHP 解释器只是使用这些参数调用函数。就像 $_SESSIONecho 一样,“它就是这样” ... 或者可能稍微更好地表述为“它在较低的层次提供”。 - Martin Tournoij
我喜欢学习新东西。这将被珍视保存。谢谢大家! - Mallow

1

你链接的文章解释了为什么不应该使用or die,例如:

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

显然,这是一个糟糕的想法,因为它可能向恶意用户输出有关您的MySQL结构的敏感信息。

然而,我认为没有什么问题(我认为文章的作者会同意我的观点)在你使用die的方式上,尽管向用户呈现选项列表确实是处理此问题的首选方式。


啊,我怀疑“or die”是他的主要关注点,但我不想把手放在火上。 - Mallow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接