所以我刚看了Why to never use 'or die'.
我比以前更困惑。我正在验证一个复杂的表单,我会通过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>
我真的不明白这比干()更干净吗?本质上我想调用另一个函数,向用户显示他们在这个时刻可以做些什么选项来修复错误,但我希望代码绝对停止运行,因为我不希望if语句进一步向下继续解析任何事情,当发现“新”或“编辑”以外的其他内容时会产生错误。
我不确定我有多清楚所以请随时让我详细说明任何不明确的观点。 (或者更好的是,隐藏的用户字段是否可以被黑客入侵?如何预防?:P)
答案 0 :(得分: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对开发很有用。
虽然过于复杂的错误处理程序,但要小心,错误处理程序内部会发生错误...?您可能已经看过Inception:)
答案 1 :(得分:1)
您链接的文章解释了您不应该使用or die
的原因,如:
$result = mysql_query($query) or die('A MySQL query occurred: ' . mysql_error());
显然这是个坏主意,因为它可能会向恶意用户输出有关MySQL结构的敏感信息。
但是,我认为在你使用它的方式中使用die
并没有错(我认为文章的作者会同意我的意见),尽管向用户提供一个选项列表会事实上,这是处理这个问题的首选方式。