Бросить исключение без остановки выполнения? - PullRequest
5 голосов
/ 29 февраля 2012

Я вырыл себе дыру в проекте, над которым я работаю.У меня есть этот массивный проект (сотни тысяч строк), и везде есть ошибки MySQL.Я сейчас нахожусь в процессе их очистки.

У меня есть этот класс базы данных, через который проходят все запросы, поэтому я делаю так, что всякий раз, когда возникает ошибка SQL, я выкидываю исключение.Проблема в том, что я не могу остановить выполнение.Это должно продолжаться, как всегда, и просто регистрировать исключение, чтобы я мог отследить их и исправить их по одному.

Я надеялся, что set_exception_handler будет делать то, что я хочу, но документы специальноскажем, это остановит выполнение после вызова моего обработчика.Так как мне обойти это?

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


Чтобы уточнить:

Я хочу вызвать исключение из моего класса базы данных (всякий раз, когда возникает ошибка SQL).Затем я хочу зарегистрировать эту ошибку и / или отобразить сообщение на экране, пока я не смогу либо исправить ошибку SQL, либо обернуть оскорбительную строку в try / catch.Я не хочу, чтобы это остановило казнь.Если я просто вызываю какую-то функцию error_handler(), а не выбрасываю исключение, я не могу ее поймать.Если я поймаю его немедленно (также внутри класса DB), то я не смогу поймать его дальше по стеку (если я не переброшу его, но тогда мы вернемся к остановке выполнения).

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Если я вас правильно понял:

function myFunction($params) {

    try {

        //your code which throws Exception

    } catch (Exception $e) {

        myErrorFunction($e);
        return false;
    }

}
0 голосов
/ 29 февраля 2012

Я думаю, что нашел обходной путь. Вместо , выдавшего исключение, я могу вызвать мой обработчик напрямую с исключением:

global_exception_handler(new MySqlException($error_message)); 

Таким образом, мой обработчик все еще вызывается, но выполнение продолжается.

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

function _global_exception_handler($e) {
    // log error here
}

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