2012-07-11 82 views
0

以下是我在C++中學習異常處理(使用visual studio 2010編譯器)的過程中編寫的代碼片段。VC++異常處理 - 應用程序崩潰無論如何

#include "stdafx.h" 
#include <iostream> 
using namespace std; 
void multi_double() { 

double first,second,product; 
try{ 
cout << "Enter the first number\n"; 
cin >> first; 
cout << "Enter the second number\n"; 
cin >> second; 
product = first * second; 
cout << product; 
} 
catch(...){cout << "Got an exceptional behaviour";} 

} 
void stud_age(){ 
int age; 
try{ 
cout << "Enter student's age\n"; 
cin >> age; 
if(age < 0) 
    throw; 
cout << endl <<age; 
} 
catch(...) { 
    cout << "Caught here\n"; 
} 
} 
class Model{ 
public: 
Model(){cout << "ctor\n";} 
~Model(){cout << "dtor\n";} 
}; 
int _tmain(int argc, _TCHAR* argv[]) { 
//multi_double(); 
//stud_age(); 
int a; 
try{ 
    Model obj; 
    int *p = NULL; 
    *p = 0;//expecting access violation exception 

} 
catch(...){ 
    cout << "caught an exception\n"; 
} 
return 0; 
} 

啓用C++異常設置爲是[/ EHsc]。 但是當我運行該應用程序時,它仍然崩潰!具有以下信息:

問題簽名: 問題事件名稱:APPCRASH 應用名稱:DataTypeConversions.exe 應用程序版本:0.0.0.0 應用程序時間戳:4ffd8c3d 故障模塊名稱:DataTypeConversions.exe 故障模塊版本:0.0 .0.0 故障模塊時間戳:4ffd8c3d 異常代碼:0000005 異常偏移量:00001051

爲什麼不控制來catch塊?

+0

您需要使用/ EHA編譯有趕上(... )也捕獲處理器異常。這是一個非常糟糕的想法。 – 2012-07-11 15:30:40

回答

1

C++異常處理系統不能硬件生成(即訪問衝突等)異常,只有代碼通過throw exception;生成異常。

如果您想要了解這些例外情況,則只能在Windows中使用structured exceptions。這與其他編譯器不兼容,並且使用__try__except構造而不是正常的try/catch

+1

SEH異常和C++異常可以融合在一起,請參閱我的答案。 – 2012-07-11 14:40:03

2

使用稱爲「C結構化異常處理(SEH)」的機制在Windows中處理訪問衝突和所有其他類型的硬件異常。最初設計的目的是爲了給C程序提供一種更加「結構化」的方式來處理異常,而不是像Posix系統中通常的signal()/ sigaction()機制。

SEH異常可將集成到C++ Exception系統中,方法是設置一個在SEH堆棧展開前調用的轉換器函數。新的轉換函數只是拋出一個C++異常,而且,C++可以捕捉到錯誤!

的所有細節請參閱從MSDN此文檔:

http://msdn.microsoft.com/de-de/library/5z4bw5h5(v=vs.80).aspx

而這裏的工作的例子:

#include <windows.h> 
#include <iostream> 
#include <eh.h> 
// You need to enable the /EHa excpetion model to make this work. 
// Go to 
// Project|Properties|C/C++|Code Generation|Enable C++ Exceptions 
// and select "Yes with SEH Exceptions (/EHa)" 

void trans_func(unsigned int u, EXCEPTION_POINTERS* pExp) 
{ 
    // printf("In trans_func.\n"); 
    throw "Hardware exception encountered"; 
} 

int main() 
{ 
    _set_se_translator(trans_func); 
    try 
    { 
     int *p = NULL; 
     *p = 0;//expecting access violation exception 
    } 
    catch(const char *s) 
    { 
     std::cout << "caught an exception:" << s << "\n"; 
    } 
    return 0; 
}