Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

exception не ловится конструкцией catch(...)

1.8K
01 сентября 2011 года
Arkady
153 / / 18.12.2007
Приветствую,

Есть такой код.
Код:
try
  {
    Clear();
    Do();
  }
  catch(int e)
  {
    char Num[16] = {0};
    std::string Str("Exception integer: ");
    Str.append(itoa(e, Num, 10));
    Add(Str, Exception);
  }
  catch(char* e)
  {
    Add(e, Exception);
  }
  catch(...)
  {
    Add("Unexpected exception!");
  }

Внутри Do() выполняется обращение к 0ому элементу пустого std::vector. Что, логично, вызывает exception.
Но я не понимаю, почему он даже при release сборке не ловится, а валит программу?
260
01 сентября 2011 года
Ramon
1.1K / / 16.08.2003
Осознайте различие между системными исключениями и исключениями C++.
277
01 сентября 2011 года
arrjj
1.7K / / 26.01.2011
Что за компилятор то? И с каким exception валится? У меня под gcc такое исключение ловится нормально.
1.8K
01 сентября 2011 года
Arkady
153 / / 18.12.2007
Цитата: Ramon
Осознайте различие между системными исключениями и исключениями C++.


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

Цитата: arrjj
Что за компилятор то? И с каким exception валится? У меня под gcc такое исключение ловится нормально.


Borland CBuilder 6. Исключение EAccessViolation (я же обращаюсь к неизвестной области памяти).

260
01 сентября 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: Arkady
Спасибо, читаю, но решения красивого не вижу. Есть литература, где этот вопрос бы раскрывался непосредственно?



Используйте std::vecrtor<>::at() вместо operator[] и обретете счастье.

277
01 сентября 2011 года
arrjj
1.7K / / 26.01.2011
Цитата: Ramon
Используйте std::vecrtor<>::at() вместо operator[] и обретете счастье.



Угу. Я чёт проверял с at(-1) :)

У Visual C++ есть ключик /EHa, который позволяет такие ексепшены отлавливать, есть ли такой у борланда - хз.

341
02 сентября 2011 года
Der Meister
874 / / 21.12.2007
Говнотладчик Borland делает останов при выбросе исключения всегда, даже если есть неспецифицированный catch (тоже и в Delphi) - я, в своё время, не сразу вкурил. Попробуйте просто продолжить выполнение программы (кнопка "плэй" или что-то вроде того). Без отладчика должно работать как ожидалось.
Скорее всего это как-то настраивается.
1.8K
02 сентября 2011 года
Arkady
153 / / 18.12.2007
Цитата: Ramon
Используйте std::vecrtor<>::at() вместо operator[] и обретете счастье.


Спасибо. Получается, разумно всегда использовать "at", вместо оператора[]?

Цитата: arrjj
Угу. Я чёт проверял с at(-1) :)

У Visual C++ есть ключик /EHa, который позволяет такие ексепшены отлавливать, есть ли такой у борланда - хз.


Нету :) Спасибо за советы.

Цитата: Der Meister
Говнотладчик Borland делает останов при выбросе исключения всегда, даже если есть неспецифицированный catch (тоже и в Delphi) - я, в своё время, не сразу вкурил. Попробуйте просто продолжить выполнение программы (кнопка "плэй" или что-то вроде того). Без отладчика должно работать как ожидалось.
Скорее всего это как-то настраивается.


Известная штука, кстати, зря Вы так, она очень удобная и в Debugger Options ее можно настраивать, если раздражает. Но тут дело было не в ней, я спецом указал, что сборка release, чтобы этот вариант отбросить.

260
02 сентября 2011 года
Ramon
1.1K / / 16.08.2003
Цитата: Arkady
Спасибо. Получается, разумно всегда использовать "at", вместо оператора[]?


Не всегда, а только в случаях отсутствия гарантий для индекса. Ибо сие чуть медленнее.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог