Функция-try-block в конструкторе: исключение исключений [дубликат]

Попробуйте эти две вещи отдельно и вместе:

  1. удалите if($_POST['submit']){}
  2. remove $from (только моя кишка)
7
задан Gam 29 March 2016 в 01:15
поделиться

2 ответа

function-try-block в конструкторе не мешает исключению исключения. Вот выдержка из стандартного черновика C ++ N4140, [except.handle]:

14 Если оператор-оператор появляется в обработчике функции -try-block конструктора, программа плохо сформирована.

15 Исключенное в настоящее время исключение отменяется, если управление достигает конца обработчика функции -try-block конструктор или деструктор. В противном случае, ...

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

На этом есть GOTW , а нижняя строка -

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

Итак, да, ваш последний пример кода отлично.

9
ответ дан Anton Savin 21 August 2018 в 21:04
поделиться
  • 1
    Итак, скажем, вы google, у которого есть политика исключения исключений, и вы нашли классную библиотеку, но класс, который вы хотите наследовать от throws (только в конструкторе, больше нигде). Если вы наследуете его, каждый человек, использующий производный класс, должен использовать try / catch каждый раз. Что бы вы сделали в этом случае? Кажется, единственный ответ: используйте другую библиотеку, только из-за конструктора ... – Gam 29 March 2016 в 01:29
  • 2
    @Phantom или не наследуйте от него, сделайте указатель на него членом и инициализируйте его в теле конструктора. Но я считаю, что в google они не позволят вам использовать эту библиотеку в любом случае. – Anton Savin 29 March 2016 в 01:49

Обтекание try / catch вокруг конструктора суперкласса позволяет вам ловушки исключений, которые бросаются в конструктор суперкласса; однако исключение автоматически восстанавливается при завершении блока catch, и исключение продолжает распространяться.

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

Из http://en.cppreference.com/w/cpp/language/function-try-block :

Основной целью функции-try-blocks является регистрация или изменение, а затем восстановление данных, исключенных из списка инициализаторов членов в конструкторе. Они редко используются с деструкторами или с регулярными функциями.

Это действительно основная добавленная функциональность блоков try-try: удобное место для регистрации «эй, эта функция породила исключение» , который охватывает всю функцию, единственное место для регистрации такого рода вещей, но не затрагивает обычную обработку исключений.

4
ответ дан Sam Varshavchik 21 August 2018 в 21:04
поделиться
Другие вопросы по тегам:

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