PHP:如何在异常处理程序中处理异常?

4

假设我们使用自定义的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个回答

2
如果 class pageClass 不存在或者无法被您的自动加载器加载,那么在您的方法 loadErrorPage() 中调用 $page = new pageClass(); 将会引发另一个异常。您需要捕获这个异常并且在没有这个类的情况下进行其他操作。
function loadErrorPage($code){
  try {
    $page = new pageClass();
    echo $page->showPage($code);
  }
  catch(Exception $e) {
    // header(...500);
    echo 'fatal error: ', $code;
  }
}

创建了一个特定的测试用例,它可以工作,我想知道为什么在实际应用中它不能工作。 - Timo Huovinen

0

嗯,你可以选择不删除pageClass.php文件...

我猜那只是一个文件,应该不难确保它不会消失,就像你确保包含__autoload函数的文件不会消失一样。


好吧,那将是最简单的方法:)显然,文件并不会消失。除非有个奇怪的网站所有者因为无聊而删除了这个文件! - Timo Huovinen
试图覆盖每一个荒谬的运行时错误会让你成为一个悲伤的程序员,你知道的... - Matti Virkkunen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接