Использование исключения для выхода из приложения PHP - PullRequest
1 голос
/ 19 марта 2012

Мое приложение имеет зарегистрированную функцию завершения работы, и, похоже, с этим связаны некоторые проблемы, и мой метод состоит в использовании исключения с попыткой / отловом для выхода из приложения (вместо использования метода exit (), поскольку FastCGI это не нравится).

Моя проблема заключается в том, что если в блоке try / catch выбрасывается другое исключение, которое не является исключением ExitApp, это приводит к непредвиденным результатам, а конечным результатом является исключение ExitApp.

Я вижу это на PHP 5.3.6, сейчас собираюсь протестировать его на другой версии, но мне любопытно, кто-нибудь может сразу указать, что здесь не так.

<?php

// Define dummy exception class
class ExitApp extends Exception {}

try {
    // Define shutdown function
    function shutdown() {
        echo "Shutting down...";
        throw new ExitApp;
    }

    register_shutdown_function("shutdown");

    // Throw exception!
    throw new Exception("EXCEPTION!");
} catch(ExitApp $e) {
    echo "Catching the exit exception!";
}

/**
 * Expected Result: Uncaught Exception Error and then "Catching the exit exception!" is printed.
 * Actual Result: Uncaught Exception Error for "Exception" and then Uncaught Exception Error for "ExitApp" even though it's being caught.
 */

Ответы [ 2 ]

0 голосов
/ 19 марта 2012

У вас неправильные ожидания от вашего кода. Во-первых, если вы выбрасываете исключение в своей функции выключения, у вас всегда будет неперехваченное исключение - функции выключения вызываются вне блока tr / catch.

Во-вторых, вы не пытаетесь перехватить неизвестное исключение - вы ловите только ExitApp типы. Вы можете попробовать что-то вроде этого:

try {
    //some stuff
} catch(ExitApp $ea) {
    //normal exit, nothing to do here
} catch(Exception $e){
    //something rather unexpected, log it
}
0 голосов
/ 19 марта 2012

Ваша функция shutdown () отсутствует даже в блоке try / catch, поэтому она никогда не будет переходить к улову для этого типа исключения.Он будет запускаться на выходе , поэтому вы больше не будете в этом блоке try / catch.

В более духовном режиме try / catch не предназначен для управления потоком.Я не совсем уверен, почему вы пытаетесь вызвать это, чтобы вызвать завершение работы скрипта, а не просто вызываете свой собственный shutdown () метод.

Надеюсь, это поможет.

...