php: обработка исключений в обработчиках исключений? - PullRequest
4 голосов
/ 13 мая 2010

Допустим, мы использовали пользовательские расширения класса Exception для обработки пользовательских исключений, как это например:

$testObject = new testClass();

и автозагрузка, подобная этой:

<code>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.'
'); }

файл 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 AND pageClass.php отсутствуют, вместо предпочтительной страницы 404 отображается фатальная ошибка.

Я запутался: S Как элегантно обработать это исключение в дескрипторе исключения?

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

Если 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;
  }
}
0 голосов
/ 13 мая 2010

Ну, вы всегда можете просто не удалять pageClass.php ...

Я предполагаю, что это всего лишь один файл, не должно быть слишком сложно убедиться, что он не исчезнет, ​​точно так же, как вы убедитесь, что файл, в котором есть ваша функция __autoload, никуда не денется .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...