@只抑制消息,而不是控制流


@ only supresses a message, not a control flow

我在PHP手册站点上发现了以下示例:

Some might think that trigger_error is like a throw() or an err.raise construction, and @ works like catch(){} one - in fact it's NOT.

function badgirl(){
    trigger_error("shame on me",E_USER_ERROR);
    return true;
}
$sheis = @badgirl();
echo "You will never see this line - @ only supress message, not a control flow";
谁能告诉我为什么最后一行不显示?是因为E_USER_ERROR中断脚本执行吗?

2)如果我用set_error_handler注册了自定义错误处理程序,并且没有在其中做exitdie,会显示最后一行吗?

  1. 这个错误中断了@的执行,因为E_USER_ERROR是一个致命的错误。试着在没有错误抑制操作符的情况下运行这个例子-它将打印:

    PHP致命错误:shame on me in/tmp/test.php on line 3

    致命错误:shame on me in/tmp/test.php on line 3

    关于错误常数的更多信息请参阅此处

  2. 当然,自定义错误处理程序可以决定继续执行。

  1. 是的,程序会停止的原因是你触发了E_USER_ERROR,默认情况下它会停止应用程序。如果触发E_USER_WARNING或更小的错误,程序将继续。
  2. 是的,自定义错误处理程序可以捕获E_USER_ERROR并决定而不是 die