请教:怎样捕获所有异常?!
我用的
try{}
catch(CException e){}
可是有些异常还是捕捉不到
问题点数:100、回复次数:14Top
1 楼smch(Ashes Of Time)回复于 2003-09-03 08:58:45 得分 25
catch(...)Top
2 楼Ah(蓝过天)回复于 2003-09-03 09:29:36 得分 0
可是catch(...)并不能知道是什么引起了异常Top
3 楼sunheroshang(简单.剑胆)回复于 2003-09-03 09:42:40 得分 5
upTop
4 楼he_zhidan(何志丹:www.dzlishi.net,www.vcshare.net)回复于 2003-09-03 09:46:29 得分 5
异常内容放在e内Top
5 楼yl0002(yl)回复于 2003-09-03 09:54:31 得分 0
catch(...)好像这个捕不到:
try{
int f;
free(&f);
}
catch(...)
{
}Top
6 楼tonybaobao(Tony宝宝)回复于 2003-09-03 09:55:42 得分 5
catch(...)是捕获所有异常,不过你要放在所有catch()段的最后,否则前面的catch()段都会无效。Top
7 楼SoLike(思危)回复于 2003-09-03 09:55:58 得分 20
C++的异常什么都可以往出抛,用这种方法确实不能获取其详细信息。
但通常抛出异常的函数或库都有抛出异常的说明,这样你就可以有目的的捕获Top
8 楼whoishere(我来也)回复于 2003-09-03 09:58:23 得分 5
还可以是
TRY
{}
CATCH_ALL( e )
{
// 这里可以从e中获取各种错误信息,例如
char szErrInfo[100];
e->GetErrorMessage( szErrInfo , 100 );
}
END_CATCH_ALLTop
9 楼xiaohedou(小河豆(充电中.18%.))回复于 2003-09-03 11:10:45 得分 5
介绍一本书书<windows核心编程>
第25章 未处理异常和C++异常 598
25.1 即时调试 600
25.2 关闭异常消息框 601
25.2.1 强制进程终止运行 601
25.2.2 包装一个线程函数 601
25.2.3 包装所有的线程函数 601
25.2.4 自动调用调试程序 602
25.3 程序员自己调用UnhandledException
Filter 602
25.4 UnhandledExceptionFilter函数的一些
细节 603
25.5 异常与调试程序 604
25.6 C++异常与结构性异常的对比 618Top
10 楼yl0002(yl)回复于 2003-09-03 14:14:30 得分 10
to SoLike(是我):
有目的的捕获,就不是楼主说的,捕获所有异常了吧!
to whoishere(我来也) :
你哪个是mfc的宏,在sdk中就玩完了。
to Ah:
不知你在什么平台下,捕获所有异常,要求不要求得到异常码,与异常信息!(这方面,我知道一点,前一段刚研究过一下)Top
11 楼SoLike(思危)回复于 2003-09-03 18:32:50 得分 5
还请楼上的多多指教Top
12 楼ayanamiwww(咩~咩『抵制日货』)回复于 2003-09-04 00:34:41 得分 5
http://expert.csdn.net/Expert/topic/2073/2073809.xml?temp=.2880213Top
13 楼smch(Ashes Of Time)回复于 2003-09-04 22:52:16 得分 5
catch ( _com_error &e )
{
_bstr_t bstrSource (e.Source());
_bstr_t bstrDescription (e.Description());
CString strError;
strError.Format("无法连接Sybase数据库。\r\n错误代码是:%08lx\r\n错误的原因是:%s\r\n错误源是:%s\r\n错误的描述是:%s\r\n", e.Error (), e.ErrorMessage (), (LPCTSTR) bstrSource, (LPCTSTR) bstrDescription);
MessageBox (strError, bstrDescription,MB_OK);
return false;
}
catch(CException &e)
{
e.ReportError();
e.Delete();
return false;
}
catch (...)
{
TRACE ( "*** 无法解决的错误 ***" );
return false;
}
这样应该可以,由于CException是其它几种异常的父类,它的派生类引起的异常也可以捕捉到。
不过最好还是根据你的代码判断会引起哪一类异常。Top
14 楼yl0002(yl)回复于 2003-09-05 09:26:58 得分 5
这方面起也了解不多。(做好的,见过一些人,不光把所有异常捕获,而且还将异常出现的行号与所在文件打出来。这时想,还是java与c井好)
在mfc:捕获异常方法很多,异常信息也很多。不用多说了。
stl的异常:用exception(及其子类)
其它异常,有其它异常对应的异常类(如上面老兄说到的com异常)
win32sdk平台下用c++,异常最好用结构化异常。
c++异常用try catch关键字。但这是c++异常。要捕获除法溢出等这样的异常,用结构化异常。用结构化异常(seh)语句(cih就用到了seh,这是os提供的)
__try compound-statement
__except ( expression ) compound-statement
注意要求在nt os以上,并不可以有析构函数的c++类对象。
还有一种方法,将c++异常转化为seh结构异常。使用_set_se_translator函数。
framework中获取到异常码,但没有异常信息。
以上是我的愚见,请大家不要见笑!Top
15 楼yl0002(yl)回复于 2003-09-05 09:38:09 得分 0
异常这方面我了解不多。说一下我的认识。(做好的,可以将异常出现的文件与行号打出来,java与c井本身提供此功能)
c++异常关键字:try catch
mfc上可以用TRY CATCHALL宏,或是CException类。
stl用exception及其子类。
其它异常有其它异常所对应的异常类(上面老兄提到的com异常)
framework win32下用c++时,想捕获除法溢出这样的c异常,最好用结构化异常seh(cih就用到过它,这是os提供的),
结构化异常关键字:
__try compound-statement
__except ( expression ) compound-statement
注意seh要求nt os以上,不能有析构函数的c++类对象。
还有一种办法:将结构化异常转化为c++异常,用_set_se_translator函数。
在这里c异常,只能提供异常码,不能提供异常信息。
以上是我的愚见,不对的,还请大侠指点!Top



