对每个应用程序错误抛出异常

时间:2010-10-14 12:21:01

标签: php exception exception-handling error-handling

我有一个基于Zend Framwork的应用程序。在一个模型中,我从另一个模型中调用一个方法。当我调用这种方法时,我使用try-cath块来处理奇怪的情况。 型号1。

try {
   $result  =  Module_Model2_Name->method();
} catch (Exception $e) {
   // Do Something
}

如果我们在try块中找到throw,那么Catch应该可以正常工作。但我不知道我的申请的行为。如果它是Model2方法中的某个应用程序错误,则应抛出异常。 在Model2的方法中,我会做下一件事,但它不起作用:

set_error_handler(create_function('$m = "Error"','throw new Exception($m);'), E_ALL);

如何在每个PHP应用程序错误上抛出异常? 非常感谢你。抱歉我的英文。

2 个答案:

答案 0 :(得分:8)

对我来说看起来不错(经过测试)。

<?php
set_error_handler(create_function('$nr, $msg = "Error"','throw new Exception($m);'), E_ALL);
try{
    foreach($notHere as $var){}
}
catch(Exception $e){
    var_dump($e);
}
?>

请注意:

  

以下错误类型不能   使用用户定义的函数处理:   E_ERROR,E_PARSE,E_CORE_ERROR,   E_CORE_WARNING,E_COMPILE_ERROR,   E_COMPILE_WARNING,以及大部分内容   E_STRICT在文件中引发了   调用set_error_handler()。

取自PHP手册。

答案 1 :(得分:4)

我的版本:

function custom_error_handler($errno, $errstr, $errfile, $errline, $errcontext)
{
    $constants = get_defined_constants(1);

    $eName = 'Unknown error type';
    foreach ($constants['Core'] as $key => $value) {
        if (substr($key, 0, 2) == 'E_' && $errno == $value) {
            $eName = $key;
            break;
        }
    }

    $msg = $eName . ': ' . $errstr . ' in ' . $errfile . ', line ' . $errline;

    throw new Exception($msg);
}

set_error_handler('custom_error_handler', E_ALL);