如何优雅地死?

Mal*_*low 5 php forms error-handling hidden-field

所以我刚读过为什么永远不要使用'或死'.

我比以前更困惑.我正在验证一个复杂的表单,我会通过if语句的多个嵌套级别,然后我会将一个变量传递给名为$ status的表单,该表单只能是'new'或'edit'.然后,当用户再次提交要验证的表单时,表单将$ status值作为隐藏字段($ _POST)传递.我想确保用户不会意外地改变这个,所以我想抓住错误,如果"新"或"编辑"以外的东西通过.(虽然我想完全消除用户在理想世界中影响这个变量的可能性.)

所以我想我会在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>
Run Code Online (Sandbox Code Playgroud)

我真的不明白这比die()更干净吗?本质上我想调用另一个函数,向用户显示他们在这个时刻可以做些什么选项来修复错误,但我希望代码绝对停止运行,因为我不希望if语句进一步向下继续解析任何事情,当发现"新"或"编辑"以外的其他内容时会产生错误.

我不确定我有多清楚,所以请随时让我详细说明任何不明确的观点.(或者更好的是,隐藏的用户字段是否可以被黑客入侵?如何预防?:P)

Mar*_*oij 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);
  }
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子,但是我们公司的网站显示了一个友好的错误页面并向我发送了一封电子邮件,我是一个白痴,并在某处搞砸了:-)

优点超过die()exit()应该明确:-)

exit()您仍然可以在需要退出时使用.例如,当您生成模板时,输出该模板,并希望代码执行停止.或者当您发送header('Location: ...');标题并希望确保执行停止时......只是不要用它来处理意外情况(即错误).

trigger_error()也为您提供更好的控制力.您可以E_USER_NOTICE在希望执行停止时发送,但显示通知,以及E_USER_ERROR何时希望执行停止.

此外,您可以编写更复杂的错误处理函数,其中一些IP看到错误,其余的不会... Kindda对开发有用.

虽然过于复杂的错误处理程序,但要小心,错误处理程序内部会发生错误...?你可能已经看过Inception :)