Попробуйте/поймайте весь блок в программе C , которая не работает

#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(...) , чтобы ловить все брошенное.