#c
Вопрос:
Блок Try/catch в C не «пойман». Я пытаюсь создать один блок catch, чтобы получить все исключения.
#include <iostream>
#include <exception>
using namespace std;
int main()
{
try
{
throw 1;
}
catch (exceptionamp; e)
{
cout << "ERROR: " << e.what() << endl;
return 1;
}
return 0;
}
Комментарии:
1. Ты бросил «ан
int
«, а неstd::exception
«а». Чтобы поймать «все»,catch(...)
.2. Можно ли затем получить информацию о том, что это было за исключение, если я использую … ?
3. @Гэри нет, это не так
4. Вы хотите знать тип исключения (например
int
) или значение (например1
)?
Ответ №1:
throw 1;
будет кидать int
. Поскольку вы не перехватываете int
, исключение остается незахваченным, что является неопределенным поведением. Хотя можно выбросить что угодно, всегда предпочитайте выбрасывать класс, производный от std::exception
. Вы можете поймать int
с catch(int e)
или catch(...)
, но на самом деле нет причин когда-либо делать это.
Если вы поймаете catch(...)
, то вы не знаете тип объекта, поэтому не можете получить доступ к каким-либо элементам, свойствам или другим аспектам, и поэтому вы не можете* собрать какую-либо информацию о том, что было брошено. Это никогда не следует использовать.
*Есть способы получить информацию о брошенном объекте, но гораздо проще просто поймать нужный тип в первую очередь
Комментарии:
1. Спасибо, хорошая информация. Если я использую»…», смогу ли я определить, что вызвало ошибку? То, что я пытаюсь сделать, — это поймать ошибки во время выполнения, которые я не уловил.
2. @Gary: Тогда правильно будет бросить
std::runtime_exception
. Сcatch(...)
его помощью невозможно определить, что вызвало ошибку.3. «исключение остается незамеченным, что является неопределенным поведением» — Нет, это довольно хорошо определено как вызов
std::terminate
.4. @MooingDuck » правильно, что нужно сделать, это бросить
std::runtime_exception
» — вы имеете в виду std::runtime_error вместо этого
Ответ №2:
Вы бросаете int
, но только ловите std::exception
. Используйте а catch(...)
, чтобы ловить все брошенное.