Exception rethrow
От: Аноним  
Дата: 03.07.08 10:09
Оценка:
Что должно напечатать?

int main(int argc, char* argv[])
{
    try
    {
        throw(std::overflow_error("err"));
    }
    catch(std::overflow_error&)
    {
        printf("In catch(std::overflow_error&)\n");
        throw;
    }
    catch(std::exception&)
    {
        printf("In catch(std::exception&)\n");
    }
    printf("End\n");
    return 0;
}
Re: Exception rethrow
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 03.07.08 10:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Что должно напечатать?


Проверил (g++ 4.2.1):

[c0der@xxx ~]$ ./rethrow
In catch(std::overflow_error&)
terminate called after throwing an instance of 'std::overflow_error'
what(): err
zsh: abort ./rethrow


Т.е., как видим, первый catch сработал, перевыбросил исключение, и его уже никто не поймал и никто не обработал.
Re[2]: Exception rethrow
От: Аноним  
Дата: 03.07.08 10:28
Оценка:
PC>Проверил (g++ 4.2.1):

Так я тоже умею
Я вот раньше думал, что оно попадёт во второй catch


PC>

PC>[c0der@xxx ~]$ ./rethrow
PC>In catch(std::overflow_error&)
PC>terminate called after throwing an instance of 'std::overflow_error'
PC> what(): err
PC>zsh: abort ./rethrow


PC>Т.е., как видим, первый catch сработал, перевыбросил исключение, и его уже никто не поймал и никто не обработал.
Re: Exception rethrow
От: Кодт Россия  
Дата: 03.07.08 10:31
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Что должно напечатать?


throw (и re-throw в частности) выбрасывает за пределы блока try-catch-catch-catch(...).
Собственно, серия catch ловит только то, что вылетело из try, а не из предшествующих catch.

Поэтому будет напечатано
In catch(std::overflow_error)
Unhandled exception, не хотите ли запустить отладчик?

(Вторая строчка — это частный случай неопределённого поведения).
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: Exception rethrow
От: Аноним  
Дата: 03.07.08 11:06
Оценка:
А>>Что должно напечатать?

К>throw (и re-throw в частности) выбрасывает за пределы блока try-catch-catch-catch(...).

К>Собственно, серия catch ловит только то, что вылетело из try, а не из предшествующих catch.

Но, вообще-то первый раз оно вылетело из try.
Это особенно хорошо заметно в C# (и, наверное, Java), где внутри исключения есть информация, откуда оно вылетело (файл, номер строки).


К>Поэтому будет напечатано

К>
К>In catch(std::overflow_error)
К>Unhandled exception, не хотите ли запустить отладчик?
К>

К>(Вторая строчка — это частный случай неопределённого поведения).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.