Использование try catch на главной в большом приложении

У меня есть приложение с множеством классов. Это приложение запускается на главной одной строчкой, скажем так:

   int main()
    {
      try
      {
          classA.start();
      }
      catch(...)
      {
          std::cout<<"EXCEPTION CAUGHT"<<std::endl;
      }
    }

После вызова classA.start() вызываются другие классы и другие процедуры. Если в этих классах возникает какое-либо непредвиденное исключение, try-catch, как указано в приведенном выше коде, не поймает их. Я пытался и мне кажется, что мне нужно установить try-catch на каждом месте, я думаю, это может быть исключением. Я хочу сказать, что, поскольку я уже рассмотрел большую часть исключений, я хочу добавить этот глобальный try-catch, чтобы обрабатывать те, которые я забыл, и иметь возможность регистрировать его и продолжать работать.

Надеюсь, я правильно объяснил.

Спасибо

Так в чем твой вопрос?

user7860670 19.07.2018 12:05

"try-catch, как указано в приведенном выше коде, их не поймает" Пожалуйста, укажите минимальный воспроизводимый пример, который показывает, что такой try-catch не будет перехватывать исключения thrown.

Algirdas Preidžius 19.07.2018 12:05

Кажется, у вас есть глобальные переменные в вашей программе (например, classA). Ваш код не будет улавливать исключения в конструкторах глобальных переменных. Но он должен улавливать все остальное. Вам, конечно, не нужно устанавливать пробный улов везде.

john 19.07.2018 12:12

@john, если по методу start() из classA я определяю int m = 5/0;, то никаких исключений не отлавливается ....

Capie 19.07.2018 12:15

@Capie Это потому, что 5/0 не генерирует исключение

john 19.07.2018 12:15

@Capie: целочисленное деление на ноль - неопределенное поведение. Смотрите мой (пукка) ответ.

Bathsheba 19.07.2018 12:16

@john что насчет этого? class Polymorphic {virtual void member(){}};Polymorphic *pb =0; typeid(*pb); это должно выбросить std::bad_typeid, но его тоже не поймали

Capie 19.07.2018 12:19

@Capie Это UB, я думаю (цитата - при применении к выражению полиморфного типа оценка выражения typeid может включать накладные расходы времени выполнения (поиск в виртуальной таблице), в противном случае выражение typeid разрешается во время компиляции.) Что произойдет, если вы попробуете throw "something" ? Как обычно, нам действительно нужна полная программа, иллюстрирующая поведение, на которое вы жалуетесь.

john 19.07.2018 12:24

@Capie *pb - это разыменование нулевого указателя, вызывающее неопределенное поведение. Вы также должны различать исключения C++ и другие исключения (например, в Windows есть исключения SEH, которые позволяют обрабатывать такие вещи, как недопустимый доступ к памяти).

user7860670 19.07.2018 12:25

Итак, есть ли способ поймать неопределенное поведение?

Capie 19.07.2018 12:27

Нет, программист несет ответственность за то, чтобы его программа не содержала неопределенного поведения. Это одна из тех вещей, которые затрудняют программирование на C++.

user7860670 19.07.2018 12:28

@Capie Чтобы поймать UB на сайте, который его вызывает? Нет. Код из-за неопределенного поведения мог просто незаметно повредить память. Как определить, было ли изменение памяти выполнено из-за UB или определенного поведения?

Algirdas Preidžius 19.07.2018 12:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, это действительно перехватит каждый исключение, брошенный в вашей программе (когда main находится в стеке вызовов), но это не обязательно включает неопределенное поведение, например

  1. доступ за пределы массива.
  2. недопустимое разыменование указателя.
  3. переполнение стека.
  4. целочисленное деление на ноль.

Повторюсь, исключения, возникающие при уничтожении объектов с продолжительностью хранения static, или при создании или уничтожении глобальных объектов, также не будут обнаружены на вашем сайте-перехватчике.

Да, и одним примечательным исключением является то, что если вы используете SEH, catch (...) действительно перехватывает исключения SEH, и это касается таких вещей, как нарушения доступа.

Mikkel K. 19.07.2018 12:39

@MikkelK .: Верно. Отсюда и мое «обязательно» в моем ответе.

Bathsheba 19.07.2018 12:40

Другие вопросы по теме