以下是我在学习C ++中的异常处理过程中编写的代码片段(使用visual studio 2010编译器)。
#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 例外代码:c0000005 例外抵消:00001051
为什么控制不会阻挡?!
答案 0 :(得分:2)
使用称为“C结构化异常处理(SEH)”的机制在Windows中处理访问冲突和所有其他类型的硬件异常。这最初旨在为C程序提供一种更“结构化”的方式来处理异常,而不是基于Posix的系统中通常的signal()/ sigaction()机制。
通过设置在SEH堆栈展开之前调用的转换器函数,可以将SEH异常 集成到C ++异常系统中。新的翻译器功能只会抛出一个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;
}
答案 1 :(得分:1)
C ++异常处理系统不能由硬件生成(即访问冲突等)异常,只能通过代码throw exception;
生成异常。
如果要捕获这些异常,则只能在Windows中使用structured exceptions。这与其他编译器不兼容,并使用__try
__except
构造而非普通try
/ catch
。