Класс исключения, который перехватывает много типов других исключений - PullRequest
1 голос
/ 13 августа 2011

Я попытался создать класс исключений (давайте назовем его EXP), который сможет перехватывать различные типы других классов исключений (например, std :: exception), но безуспешно.Основная проблема заключается в том, что есть много типов исключений, которые мне нужно перехватить, и я подумал, есть ли лучший способ, чем написать макрос, который содержит все возможные перехваты.

Что я хочу сделать (еслиэто даже возможно) что-то вроде этого:

class EXP : ?? maybe must inherit ??
{
    // EXP implementation
}

EXP определяется таким образом, что это возможно:

try
{
   throw std::exception("error string");
}
catch(const EXP& e)
{
   // catches the exception
}

Так что, если это возможно, как я могу определить EXPтак он будет делать то, что я хочу?

Спасибо!: -)

Ответы [ 2 ]

4 голосов
/ 13 августа 2011
  • во-первых, обычно ужасно ловить каждый тип исключения. Вообще говоря, если вы не знаете, что такое исключение , как вы можете осмысленно обработать его, когда оно происходит?
  • секунда, если вы хотите перехватить каждый тип исключения, вы можете использовать catch (...). Однако это не дает вам прямого доступа к объекту перехваченного исключения. Чтобы получить доступ к объекту исключения, вам необходимо повторно отбросить и catch каждый конкретный тип, который вы поддерживаете (это перебрасывание и повторная сборка могут быть выполнены в отдельной функции, которая может быть решением вашего вопроса).
  • в-третьих, даже это ловит только исключения C ++. Другие ошибки, такие как ошибки сегментации / нарушения доступа, не будут обнаружены этим. Если вы хотите отлавливать ошибки такого рода, вам нужно использовать специфичные для платформы операции или языковые расширения.
  • наконец, преобразования типов не учитываются при отлове исключений. Если выброшен тип исключения E, вы можете обработать его только путем перехвата E или любого из его базовых классов. Но вы не можете, например, справиться с этим, поймав исключение, которое может быть создано из E.

Примечание: что касается схемы перебрасывания во втором пункте, она может не работать с предварительно стандартными компиляторами; например он не работает с Visual C ++ 6.0.

1 голос
/ 13 августа 2011

Лучший подход - извлечь все типы исключений из std::exception (или его стандартных подтипов, таких как std::runtime_error);затем вы можете использовать catch (std::exception const &), чтобы поймать что-либо, выданное вашим кодом, стандартной библиотекой или любой другой библиотекой с хорошим поведением.

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