В C ++ возможно ли выдать исключение, которое не будет перехвачено std :: exception? - PullRequest
2 голосов
/ 26 мая 2009

Вопрос 1:

Возможно ли создать исключение, которое не будет перехвачено std :: exception?

try
{
}
catch(std::exception & e)
{
}
catch(...)
{
  //Is this block needed?
}

Вопрос 2:

Лучше иметь:

catch(std::exception & e)

Или

catch(std::exception e)

Или

catch(const std::exception &e)//<--- this is the method I usually use

Ответы [ 4 ]

11 голосов
/ 26 мая 2009

Q1: да. Вы можете выбросить любой тип, необязательные типы, которые наследуются от std :: exception.
Вы можете написать throw 1; throw и int или throw "hello"; throw char*, оба из которых не наследуются от std::exception. однако это считается плохой практикой, потому что пользователь класса не может ожидать, что вы бросите что-нибудь. Если вы не хотите наследовать от std::exception, обычно вы создаете собственную иерархию исключений.

Q2: перехват исключения по значению (2-й вариант) является плохой практикой, поскольку вы принудительно копируете экземпляр исключения и при этом возможно выполняете выделения, которые могут вызвать дальнейшие исключения.
Использование первой опции предполагает, что вы намереваетесь изменить e в блоке catch, чего также вам, вероятно, хотелось бы избежать, поскольку исключения обычно остаются неизменными после создания. Единственное, что осталось, это третий вариант.

6 голосов
/ 26 мая 2009

Конечно, вы можете бросить любой тип, какой хотите, и его не нужно выводить из std::exception.

Лучше поймать const ссылку. Причина в том, что вы можете бросить const или не-const, и он может быть пойман не-const. Который работает как тихое изгнание const.

4 голосов
/ 26 мая 2009

Ответ на ваш второй вопрос заключается в том, что вы должны бросить по значению и поймать по ссылке. Если вы поймете по значению, вы можете получить ' Object Slicing '.

0 голосов
/ 26 мая 2009

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

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