crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> не задачка N8
Andrew Selivanov
  опции профиля:
сообщение 14.4.2008, 16:50
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Ну на самом деле не задачка (как я справедливо написал в теме), но не будем расслабляться :)
Вопрос: Что будет?
#include <iostream>
#include <stdexcept>
using namespace std;

class A
{
public:        
    A()
    {
        
    }
    
    ~A()
    {
        throw;
    }    
};

int main()
{        
    try
    {
        throw std::runtime_error("some exception");
    }
    catch(std::exception& e)
    {    
        A a;
        cout << "exception: " << e.what() << endl;
    }
    
    return 0;
}


Сообщение отредактировал Andrew Selivanov - 14.4.2008, 16:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
archimed7592
  опции профиля:
сообщение 15.4.2008, 3:48
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 27.12.2007
Из: Moscow
Пользователь №: 56

Спасибо сказали: 0 раз(а)




Репутация:   0  


Выведет "exception: some exception", после чего будет abnormal termination, но только лишь потому, что исключение выпустили из main, а не потому, что оно было брошено в деструкторе.
Т.е. если сделать так:
int main()
{
    cout << "begin" << endl;
    try
    {
        throw std::runtime_error("some exception");
    }
    catch(std::exception& e)
    {    
        try
        {
            A a;
            cout << "exception: " << e.what() << endl;
        }
        catch(...)
        { }
    }
    
    cout << "end" << endl;
}
то будет "begin\nexception: some exception\nend"
А так:

int main()
{        
    cout << "begin" << endl;
    try
    {
        A a;
        throw std::runtime_error("some exception");
    }
    catch(std::exception& e)
    {    
        cout << "exception: " << e.what() << endl;
    }
    cout << "end" << endl;
}
уже будет беда из-за выпущенного из деструктора исключения аля "begin\nabnormal termination".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
LuckLess
  опции профиля:
сообщение 15.4.2008, 11:51
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 31
Регистрация: 10.10.2007
Пользователь №: 8

Спасибо сказали: 0 раз(а)




Репутация:   0  


кстати... никогда не встречал чтоб писали просто throw не в catch блоке.. что это означает то вообще?
Вылет исключения которое можно поймать только catch (...) ??
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 16.4.2008, 8:05
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Это означает, что этот кусок кода прямо или косвенно будет вызываться именно в catch блоке.
Если это не так - abnormal termination.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 25.4.2024, 7:54