У меня есть приложение с множеством классов. Это приложение запускается на главной одной строчкой, скажем так:
int main()
{
try
{
classA.start();
}
catch(...)
{
std::cout<<"EXCEPTION CAUGHT"<<std::endl;
}
}
После вызова classA.start() вызываются другие классы и другие процедуры. Если в этих классах возникает какое-либо непредвиденное исключение, try-catch, как указано в приведенном выше коде, не поймает их. Я пытался и мне кажется, что мне нужно установить try-catch на каждом месте, я думаю, это может быть исключением. Я хочу сказать, что, поскольку я уже рассмотрел большую часть исключений, я хочу добавить этот глобальный try-catch, чтобы обрабатывать те, которые я забыл, и иметь возможность регистрировать его и продолжать работать.
Надеюсь, я правильно объяснил.
Спасибо
"try-catch, как указано в приведенном выше коде, их не поймает" Пожалуйста, укажите минимальный воспроизводимый пример, который показывает, что такой try-catch не будет перехватывать исключения thrown.
Кажется, у вас есть глобальные переменные в вашей программе (например, classA). Ваш код не будет улавливать исключения в конструкторах глобальных переменных. Но он должен улавливать все остальное. Вам, конечно, не нужно устанавливать пробный улов везде.
@john, если по методу start() из classA я определяю int m = 5/0;, то никаких исключений не отлавливается ....
@Capie Это потому, что 5/0 не генерирует исключение
@Capie: целочисленное деление на ноль - неопределенное поведение. Смотрите мой (пукка) ответ.
@john что насчет этого? class Polymorphic {virtual void member(){}};Polymorphic *pb =0; typeid(*pb); это должно выбросить std::bad_typeid, но его тоже не поймали
@Capie Это UB, я думаю (цитата - при применении к выражению полиморфного типа оценка выражения typeid может включать накладные расходы времени выполнения (поиск в виртуальной таблице), в противном случае выражение typeid разрешается во время компиляции.) Что произойдет, если вы попробуете throw "something" ? Как обычно, нам действительно нужна полная программа, иллюстрирующая поведение, на которое вы жалуетесь.
@Capie *pb - это разыменование нулевого указателя, вызывающее неопределенное поведение. Вы также должны различать исключения C++ и другие исключения (например, в Windows есть исключения SEH, которые позволяют обрабатывать такие вещи, как недопустимый доступ к памяти).
Итак, есть ли способ поймать неопределенное поведение?
Нет, программист несет ответственность за то, чтобы его программа не содержала неопределенного поведения. Это одна из тех вещей, которые затрудняют программирование на C++.
@Capie Чтобы поймать UB на сайте, который его вызывает? Нет. Код из-за неопределенного поведения мог просто незаметно повредить память. Как определить, было ли изменение памяти выполнено из-за UB или определенного поведения?





Да, это действительно перехватит каждый исключение, брошенный в вашей программе (когда main находится в стеке вызовов), но это не обязательно включает неопределенное поведение, например
Повторюсь, исключения, возникающие при уничтожении объектов с продолжительностью хранения static, или при создании или уничтожении глобальных объектов, также не будут обнаружены на вашем сайте-перехватчике.
Да, и одним примечательным исключением является то, что если вы используете SEH, catch (...) действительно перехватывает исключения SEH, и это касается таких вещей, как нарушения доступа.
@MikkelK .: Верно. Отсюда и мое «обязательно» в моем ответе.
Так в чем твой вопрос?