php:处理异常处理程序中的异常?

时间:2010-05-13 12:08:47

标签: php exception-handling

假设使用Exception类的自定义扩展来处理自定义异常, 比如这样:

$testObject = new testClass();

和像这样的自动加载:

function __autoload($class_name) {
    $file = $class_name.'.php';
    if (file_exists($file)) {
        include $file;  
    }else{
        throw new loadException("File $file is missing");
    }
    if(!class_exists($class_name,false)){
        throw new loadException("Class $class_name missing in $file");
    }
    return true;
}

try {
    $testObject = new testClass();
}catch(loadException $e){
    exit('<pre>'.$e.'</pre>');
}

文件testClass.php不存在,因此使用以下消息调用loadException: 文件testClass.php丢失了。 (以及所有其他细节......行号等)

一切都很好,直到我决定隐藏所有错误,而是显示404页面(或500页......),所以自然我想添加一个loadErrorPage函数。

class loadException {

...

    function loadErrorPage($code){
        $page = new pageClass();
        echo $page->showPage($code);
    }
}

...

try {
    $testObject = new testClass();
}catch(loadException $e){
    $e->loadErrorPage(500);
}

但是这有一个明显的问题,如果缺少testClass.php和pageClass.php文件,则会显示致命错误,而不是首选的404页面。

我很困惑:S 如何在异常句柄中优雅地处理此异常?

2 个答案:

答案 0 :(得分:2)

如果class pageClass不存在,并且您的方法$page = new pageClass();中的自动加载器loadErrorPage()无法加载,则会导致另一个异常。您必须捕获此异常,然后在没有该类的情况下执行某些操作。

function loadErrorPage($code){
  try {
    $page = new pageClass();
    echo $page->showPage($code);
  }
  catch(Exception $e) {
    // header(...500);
    echo 'fatal error: ', $code;
  }
}

答案 1 :(得分:0)

好吧,你总是可以不删除pageClass.php ...

我假设这只是一个文件,不应该太难以确保它不会消失,就像你要确保其中包含__autoload函数的文件不会消失一样