Как я могу узнать имя исключения в C ++? - PullRequest
2 голосов
/ 25 июня 2010

С помощью Python я мог легко получить имя исключения следующим образом.

  1. запустите код, то есть x = 3/0, чтобы получить исключение из python
  2. «ZeroDivisionError: целочисленное деление или по модулю на ноль» говорит мне, что это ZeroDivisionError
  3. Измените код, т.е. попробуйте: x = 3/0, за исключением ZeroDivisionError: ДЕЛАЙТЕ что-нибудь

Есть ли подобный способ найти имя исключения в C ++?

Когда я запускаю x = 3/0, скомпилированный двоичный файл просто выдает «Исключение с плавающей запятой», что не так полезно по сравнению с python.

Ответы [ 4 ]

4 голосов
/ 25 июня 2010

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

try
{
    ...
}
catch (const std::exception &exc)
{
    std::err << exc.what() << std::endl;
}

Вкл.примечание: деление на 0 не обязательно вызывает исключение C ++ (я думаю, что платформы MS могут это делать, но вы не получите этого в Linux).

1 голос
/ 25 июня 2010

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

1 голос
/ 25 июня 2010

Для большинства исключений, если в компиляторе установлена ​​опция RTTI, вы можете сделать:

catch(std::exception & e)
{
    cout << typeid(e).name();
}

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

1 голос
/ 25 июня 2010

Если вы хотите узнать имя класса исключения, вы можете использовать RTTI. Однако подавляющее большинство кода C ++ генерирует исключение, полученное из std :: exception.

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

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