2010-09-30 6 views
1

Я просто играл с исключениями в визуальной студии и с приведенным выше кодом, я ожидал, что, поскольку в моей спецификации исключения не упоминается ничего, что должно было быть вызвано 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; 
} 
+0

darn! я вижу код, выровненный правильно в предварительном просмотре, но не здесь! :( –

+0

Используйте кнопку '101010' над редактором для форматирования кода. – sbi

+0

@sbi: Спасибо! Попробуйте эту кнопку. Я попробовал, что на самом деле я использовал теги code & prev, и, как ни странно, в предварительном просмотре он отображал правильный отступ, но не в post. :( –

ответ

6

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

В то время как пустая спецификация исключения несколько полезна (но, как сказано, неправильно реализована VS), в целом спецификации исключений рассматриваются как an experiment that failed.

+0

Спасибо! Я не знал об этом, но, к счастью, никогда не использовал спецификации исключений. Фактически Q у меня на уме, не так хорошо. –

1

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

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

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

Смежные вопросы