exception не ловится конструкцией catch(...)
Есть такой код.
Код:
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!");
}
{
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 сборке не ловится, а валит программу?
Осознайте различие между системными исключениями и исключениями C++.
Что за компилятор то? И с каким exception валится? У меня под gcc такое исключение ловится нормально.
Цитата: Ramon
Осознайте различие между системными исключениями и исключениями C++.
Спасибо, читаю, но решения красивого не вижу. Есть литература, где этот вопрос бы раскрывался непосредственно?
Цитата: arrjj
Что за компилятор то? И с каким exception валится? У меня под gcc такое исключение ловится нормально.
Borland CBuilder 6. Исключение EAccessViolation (я же обращаюсь к неизвестной области памяти).
Угу. Я чёт проверял с at(-1) :)
У Visual C++ есть ключик /EHa, который позволяет такие ексепшены отлавливать, есть ли такой у борланда - хз.
Скорее всего это как-то настраивается.
Спасибо. Получается, разумно всегда использовать "at", вместо оператора[]?
Цитата: arrjj
Угу. Я чёт проверял с at(-1) :)
У Visual C++ есть ключик /EHa, который позволяет такие ексепшены отлавливать, есть ли такой у борланда - хз.
У Visual C++ есть ключик /EHa, который позволяет такие ексепшены отлавливать, есть ли такой у борланда - хз.
Нету :) Спасибо за советы.
Цитата: Der Meister
Говнотладчик Borland делает останов при выбросе исключения всегда, даже если есть неспецифицированный catch (тоже и в Delphi) - я, в своё время, не сразу вкурил. Попробуйте просто продолжить выполнение программы (кнопка "плэй" или что-то вроде того). Без отладчика должно работать как ожидалось.
Скорее всего это как-то настраивается.
Скорее всего это как-то настраивается.
Известная штука, кстати, зря Вы так, она очень удобная и в Debugger Options ее можно настраивать, если раздражает. Но тут дело было не в ней, я спецом указал, что сборка release, чтобы этот вариант отбросить.
Цитата: Arkady
Спасибо. Получается, разумно всегда использовать "at", вместо оператора[]?
Не всегда, а только в случаях отсутствия гарантий для индекса. Ибо сие чуть медленнее.