@仅限制消息,而不是控制流

时间:2014-03-24 12:48:38

标签: php

我在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";

1)任何人都可以解释一下为什么最后一行不会显示?是因为E_USER_ERROR打破了脚本执行吗?

2)如果我使用set_error_handler注册我的自定义错误处理程序但未在其中显示exitdie,最后一行会显示该怎么办?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  1. 该错误会以@静默执行,因为E_USER_ERROR是致命错误。尝试在没有错误抑制操作符的情况下运行该示例 - 它将打印:

    PHP致命错误:第3行的/tmp/test.php让我感到羞耻

    致命错误:第3行的/tmp/test.php让我感到羞耻

    more on error constants here

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