【问题标题】:php: handling exceptions within exception handlers?php:在异常处理程序中处理异常?
【发布时间】:2010-05-13 12:08:47
【问题描述】:

假设使用 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 如何在异常句柄中优雅地处理这个异常?

【问题讨论】:

    标签: php exception-handling


    【解决方案1】:

    如果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;
      }
    }
    

    【讨论】:

    • ok 创建了一个特定的测试用例,它确实有效,我想知道为什么它在实际应用中不起作用。
    【解决方案2】:

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

    我假设这只是一个文件,不应该太难确保它不会消失,就像您确保其中包含 __autoload 函数的文件不会去任何地方一样.

    【讨论】:

    • 嗯,这将是最简单的方法:),显然文件不会去任何地方。除非有一个奇怪的网站所有者出现并出于无聊而删除此文件!
    • 试图掩盖每一个可笑的运行时错误会让你成为一个可悲的编码员,你知道...
    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 2012-03-04
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多