Что происходит, если я использую “бросок”; без исключения для броска?

Вот установка.

У меня есть программа C++, которая вызывает несколько функций, все из которых потенциально бросают тот же набор исключения, и я хочу то же поведение для исключений в каждой функции (например, распечатайте сообщение об ошибке и сбросьте все данные к значению по умолчанию для exceptionA; просто печать для exceptionB; завершите работу чисто для всех других исключений).

Кажется, что я должен смочь установить поведение выгоды вызвать закрытую функцию, которая просто повторно бросает ошибку и выполняет выгоды, как так:

void aFunction()
{
    try{ /* do some stuff that might throw */ }
    catch(...){handle();}
}

void bFunction()
{
    try{ /* do some stuff that might throw */ }
    catch(...){handle();}
}

void handle()
{
    try{throw;}
    catch(anException)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
    catch(anotherException)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
    catch(...)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
}

Теперь, что происходит, если "дескриптор" называют за пределами класса исключений. Я знаю, что этого никогда не должно происходить, но я задаюсь вопросом, не определено ли поведение по стандарту C++.

9
задан rekire 2 May 2012 в 19:33
поделиться

3 ответа

Если handle () вызывается вне контекста исключения, вы выбросите без исключения обработано. В этом случае стандарт (см. Раздел 15.5.1) указывает, что

Если в настоящее время не обрабатывается исключение, выполнение выражения throw без вызовов операндов terminate () .

, поэтому ваше приложение будет прекращено. Вероятно, это не то, что вам здесь нужно.

16
ответ дан 4 December 2019 в 09:36
поделиться

Я нашел его здесь . Позор документации Hibernate.

-121--4222821-

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

Фасад - это лицо (буквально говоря), поэтому их аналогия с базовым классом не совсем держится. Фасад - это скорее интерфейс, поэтому он не должен быть связан с теми вещами, которые его используют. Я думаю, что это скорее маска. В моем классе будет «одноразовая» маска, например.

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

-121--4631680-

Если вы используете вброс внутри блока catch, исключение будет возвращено обратно. При использовании вбрасывания за пределы блока catch приложение будет прервано.

5
ответ дан 4 December 2019 в 09:36
поделиться

Никогда, никогда, никогда не используйте catch (...), так как вы можете отловить ошибки приложения, которые вы не хотите перехватывать, например ошибки, нарушения доступа (в зависимости от того, как вы скомпилировали).

Прочтите замечательную книгу Джона Роббинса («Отладка приложений Windows»), в которой он более подробно объясняет, почему вам не следует этого делать.

1
ответ дан 4 December 2019 в 09:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: