Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Странное поведение исключений  (Прочитано 5656 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« : 12-08-2011 16:32 » 

Собственно вопрос в том, почему не отлавливаются исключения без параметра? Хотя во многих книжках встречал примеры исключений без параметра (правда щас уже не вспомню в каких).

Код: (C++)
// Случай номер один:
try {
    throw; // генерируем исключение
}
// говорим - ловить любые исключения
catch(...) {
    // сюда почему - то не попадаем, вместо этого программа вываливается с Unhandled Exception
}

// Случай номер два:
try {
    throw 0; // генерируем исключение с ПАРАМЕТРОМ!
}
// говорим - ловить любые исключения
catch(...) {
    // срабатывает как надо
}

Компилятор:
Код:
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.2-8ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --with-multiarch-defaults=x86_64-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib/x86_64-linux-gnu --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib/x86_64-linux-gnu --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --enable-ld=default --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
Записан

Любимая игрушка - debugger ...
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 12-08-2011 20:13 » 

throw без параметров не создает исключения! Это способ ретранслировать уже пойманное исключение.

Код: (C++)
func1()
{
    try
    {
        throw 0;
    }
    catch (...)
    {
        throw; // Перебрасываем дальше
    }
}

func2()
{
    try
    {
        func1();
    }
    catch (...)
    {
        // Ловим здесь (int)0
    }
}
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 12-08-2011 20:22 » 

RXL, Вот оно оказывается как, век живи век учись Улыбаюсь Спасибо за разъяснение.
Записан

Любимая игрушка - debugger ...
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 12-08-2011 20:42 » 

RuNTiME, throw без параметра во многих языках означает не генерацию исключения, а ре-генерацию. И используется это внутри секции catch. Т.е. ты поймал какое-то исключение в catch, что-то поделал и принял решение, что полностью справиться с ситуацией не можешь, тогда ты пишешь "throw;" и это означает, что текущее исключение, которое поймала текущая секция catch, с этого места перестаёт считаться пойманным, и стек вызовов разворачивается дальше до тех пор, пока какая-нибудь внешняя секция catch не поймает это исключение, или пока программа не завершит свою работу аварийным способом.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines