Вопрос об исключениях - PullRequest
       2

Вопрос об исключениях

1 голос
/ 30 сентября 2010

Я просто играл с исключениями в визуальной студии и с приведенным выше кодом, я ожидал, что, поскольку в спецификации исключений ничего не сказано, должно быть сгенерировано bad_exception.Но на самом деле происходит исключение, которое перехватывается соответствующим обработчиком.Почему так?Я пропускаю какие-то настройки или что-то в IDE?

Хотя я застрял в вышеупомянутом, На самом деле я пытался найти ответ на вопрос: если у меня есть пустая спецификация исключения, что тогда вызывается?метод непредвиденный () или * bad_exception * будут выброшены, и если оба в каком порядке?Вот код.

 #include "stdafx.h"  
 #include <stdio.h>  
 #include <exception>  
 #include <iostream>  


using namespace std;

class A
{
    public:
        int i;
};

void myunexpected () 
{
    cerr << "unexpected called\n";
}

void doSomething(void) throw();
void doSomething(void) throw()
{
    A obj;
    obj.i= 100;
    throw obj;
}


int _tmain(int argc, _TCHAR* argv[])
{
    set_unexpected (myunexpected);
    try 
    {
        doSomething();
    }
    catch (bad_exception be) 
    {
        puts("Caught something");
    }
    catch (A &obj) 
    {
        puts("Caught Integer");
    }
    return 0;
}

Ответы [ 2 ]

6 голосов
/ 30 сентября 2010

Что касается спецификации исключений, Visual Studio не соответствует стандартам.

Хотя пустая спецификация исключения несколько полезна (но, как уже говорилось, не реализована должным образом VS), в целом спецификации исключений рассматриваются как эксперимент, который не удался .

1 голос
/ 30 сентября 2010

По сути, спецификации исключений практически бесполезны и во многих компиляторах реализованы иначе, чем указано в стандарте. Обратитесь к документации вашего компилятора за дополнительной информацией.

http://msdn.microsoft.com/en-us/library/wfa0edys(VS.80).aspx

Я могу себе представить, что это, в частности, означает, что компилятор VS будет использовать спецификацию исключений, чтобы избежать генерации кода, необходимого для разматывания стека, и что в случае фактического создания исключения вы в конечном итоге получите неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...