c++ 异常处理
谁能给我举一个比较简单的异常处理的例子用trycatch去捕获异常帮我写一个比较简单的例子吧,要求如下:程序调用了N(随便几个都成)个函数(微软提供的API或者自己写的函...
谁能给我举一个比较简单的异常处理的例子
用try catch去捕获异常
帮我写一个比较简单的例子吧,要求如下:
程序调用了N(随便几个都成)个函数(微软提供的API或者自己写的函数均可),但是其中有一个函数导致了程序的崩溃,请用try catch去捕获到底是哪个函数导致程序崩溃的?
麻烦帮我写一个简单例子。。。谢谢了!(用c++写)
不好意思,补充一点:
try catch不能放到被调函数的函数体内,而应该在主调函数的函数体中,所以,最好是能够提供一个调用微软API而导致程序崩溃的实例,当然,自己写的函数也成,只要能说明问题就行……
我要的是具体的例子!谢谢! 展开
用try catch去捕获异常
帮我写一个比较简单的例子吧,要求如下:
程序调用了N(随便几个都成)个函数(微软提供的API或者自己写的函数均可),但是其中有一个函数导致了程序的崩溃,请用try catch去捕获到底是哪个函数导致程序崩溃的?
麻烦帮我写一个简单例子。。。谢谢了!(用c++写)
不好意思,补充一点:
try catch不能放到被调函数的函数体内,而应该在主调函数的函数体中,所以,最好是能够提供一个调用微软API而导致程序崩溃的实例,当然,自己写的函数也成,只要能说明问题就行……
我要的是具体的例子!谢谢! 展开
3个回答
展开全部
__try//去掉前面的下划
{
CreateProcessA("c:\\windows\\system32\\notepad.exe", NULL, NULL, NULL, false, 0, NULL, NULL, NULL, NULL);
}
__except(EXCEPTION_EXECUTE_HANDLER)//将此段注释掉,并将下面的catch段全部恢复
{
MessageBoxA(0, "CMemoryException", 0, 0);
}
//catch (CMemoryException* e)
//{
// //e->GetErrorMessage()
// MessageBoxA(0, "CMemoryException", 0, 0);
//}
//catch (CFileException* e)
//{
// MessageBoxA(0, "CFileException", 0, 0);
//}
//catch (CException* e)
//{
// MessageBoxA(0, "CException", 0, 0);
//}
你可以将__try,__except改成try catch试试。
说点基本知识:
在debug版本中try catch是可行的,当然也有不行的时候,这里是相对来说
但在release版本编译器没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉
需要使用__try, __except.
但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。 而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢?
有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。
=====补充下====
如果单纯从回答问题的角度来讲,是讨论try catch的用法。
但从问题本身的意义来讲,是为了避免出错,及快速定位问题。
所以从避免出错,以及快速定位来讲,使用try catch是很苍白的。
就快速定位来讲:try catch使用就麻烦了,且也不直接。
我这里有多种方案来快速定位:
前提定义一套输出到log文件的函数
1.每个不保险的函数中增加一个块,
AA()//设其不保险
{
#ifdef _DEBUG
//这里调用你那一套输出log文件,当然并非一定要用log文件,也可以用直接输出信息,
//这个根据情况,当然你也可以把#ifdef块写到你定义的输出函数中。
#endif
}
2.根据输出信息来看执行到哪了,因为程序挂住了,程序后面的信息就输出不了,所以你就找最后一条输出的下一个函数。
最后补充:其实没有什么好的机制来快速定位错误,当然拦截错误为用户提供友好界面就另外一回事。
因为有好的机制你实现起来略显麻烦,不管多大的项目,都有常用代码,大部分是经验。
哎还没说完,有事要出去了,不过这些应该能让你明白意思
{
CreateProcessA("c:\\windows\\system32\\notepad.exe", NULL, NULL, NULL, false, 0, NULL, NULL, NULL, NULL);
}
__except(EXCEPTION_EXECUTE_HANDLER)//将此段注释掉,并将下面的catch段全部恢复
{
MessageBoxA(0, "CMemoryException", 0, 0);
}
//catch (CMemoryException* e)
//{
// //e->GetErrorMessage()
// MessageBoxA(0, "CMemoryException", 0, 0);
//}
//catch (CFileException* e)
//{
// MessageBoxA(0, "CFileException", 0, 0);
//}
//catch (CException* e)
//{
// MessageBoxA(0, "CException", 0, 0);
//}
你可以将__try,__except改成try catch试试。
说点基本知识:
在debug版本中try catch是可行的,当然也有不行的时候,这里是相对来说
但在release版本编译器没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉
需要使用__try, __except.
但是用__try, __except块还有问题, 就是这个不是C++标准, 而是Windows平台特有的扩展。 而且如果在使用过程中涉及局部对象析构函数的调用,则会出现C2712 的编译错误。 那么还有没有别的办法呢?
有, 就是仍然使用C++标准的try{}catch(..){}, 但在编译命令行中加入 /EHa 的参数。这样VC编译器不会把try catch模块给优化掉了。
=====补充下====
如果单纯从回答问题的角度来讲,是讨论try catch的用法。
但从问题本身的意义来讲,是为了避免出错,及快速定位问题。
所以从避免出错,以及快速定位来讲,使用try catch是很苍白的。
就快速定位来讲:try catch使用就麻烦了,且也不直接。
我这里有多种方案来快速定位:
前提定义一套输出到log文件的函数
1.每个不保险的函数中增加一个块,
AA()//设其不保险
{
#ifdef _DEBUG
//这里调用你那一套输出log文件,当然并非一定要用log文件,也可以用直接输出信息,
//这个根据情况,当然你也可以把#ifdef块写到你定义的输出函数中。
#endif
}
2.根据输出信息来看执行到哪了,因为程序挂住了,程序后面的信息就输出不了,所以你就找最后一条输出的下一个函数。
最后补充:其实没有什么好的机制来快速定位错误,当然拦截错误为用户提供友好界面就另外一回事。
因为有好的机制你实现起来略显麻烦,不管多大的项目,都有常用代码,大部分是经验。
哎还没说完,有事要出去了,不过这些应该能让你明白意思
展开全部
一看有人答了,既然写了就贴上来吧.别浪费:
#include <iostream>
using namespace std;
void test()
{
int a = 0;
int b = 123;
b = b /a; /////除0异常
}
int Test2()
{
throw 3;
}
void main()
{
try
{
Test2();
}
catch (...)
{
cout <<"函数调用异常1!"<<endl;
}
try
{
test();
}
catch (...)
{
cout <<"函数调用异常2!"<<endl;
}
}
#include <iostream>
using namespace std;
void test()
{
int a = 0;
int b = 123;
b = b /a; /////除0异常
}
int Test2()
{
throw 3;
}
void main()
{
try
{
Test2();
}
catch (...)
{
cout <<"函数调用异常1!"<<endl;
}
try
{
test();
}
catch (...)
{
cout <<"函数调用异常2!"<<endl;
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void fun1()
{
try
{
fun2();
}
catch(exception& ex)
{
cout << "" << endl;
}
cathc(...)
{
}
}
void fun2()
{
if(...)
{
throw exception();
}
}
{
try
{
fun2();
}
catch(exception& ex)
{
cout << "" << endl;
}
cathc(...)
{
}
}
void fun2()
{
if(...)
{
throw exception();
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询