vc6下,如何捕获异常信息
vc6下,如何捕获具体的异常信息呢?期待高手出现,回答我的问题。用代码示例说明如下:创建一个win32consoleapplication工程,并粘贴如下代码://con...
vc6下,如何捕获具体的异常信息呢?期待高手出现,回答我的问题。
用代码示例说明如下:
创建一个win32 console application 工程,并粘贴如下代码:
// con3.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdlib.h"
int main(int argc, char* argv[])
{
try
{
int n1,n2,n3;
n1=1;
n2=2;
//n2=0; //Debug下打开此句,会看到信息:Unhandled exception in con3.exe:0xC0000094: Integer Divide by Zero
n3=n1/n2;
n3=atoi("123");
//n3=atoi(NULL); //Debug下打开此句,会看到信息:Unhandled exception in con3.exe:0xC0000005: Access Violation
printf("Every thing is ok, bye bye!\n");
return 0;
}
catch(...)
{
printf("Exception ocurred! errmsg=%s\n","我不知道!");
return 1;
}
}
代码很简单,只是个示意而已。
上面的代码中,打开故意撰写的错误代码,就会获得对应的异常。
问题是: 我如何获得这些异常信息呢?
问过很多人了,也百度了一大圈,都没有结果。
期待真正的高手,给出简洁而正确的答案,为解心中之惑,悬赏100分! 展开
用代码示例说明如下:
创建一个win32 console application 工程,并粘贴如下代码:
// con3.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdlib.h"
int main(int argc, char* argv[])
{
try
{
int n1,n2,n3;
n1=1;
n2=2;
//n2=0; //Debug下打开此句,会看到信息:Unhandled exception in con3.exe:0xC0000094: Integer Divide by Zero
n3=n1/n2;
n3=atoi("123");
//n3=atoi(NULL); //Debug下打开此句,会看到信息:Unhandled exception in con3.exe:0xC0000005: Access Violation
printf("Every thing is ok, bye bye!\n");
return 0;
}
catch(...)
{
printf("Exception ocurred! errmsg=%s\n","我不知道!");
return 1;
}
}
代码很简单,只是个示意而已。
上面的代码中,打开故意撰写的错误代码,就会获得对应的异常。
问题是: 我如何获得这些异常信息呢?
问过很多人了,也百度了一大圈,都没有结果。
期待真正的高手,给出简洁而正确的答案,为解心中之惑,悬赏100分! 展开
1个回答
展开全部
其实你上一个帖子我已经和你说过这样的问题了,你就是想不通,老把vc当java这种高级语言来看待,你的理念一直有问题,所以你的问题也是不能解决的。
你可以试想一下,在汇编程序里,有没有像java或vb一样的捕获这种异常信息的方法呢?可能你会觉得很可笑,汇编怎么可能有这种应用呢?对,那你为什么就认为VC就一定有这种应用呢?难道只是因为和java的语法相似?如果只是因为这样,难道说php也和VC是一个开发理念?VC并不是高级语言,也不是什么面向对象的编程,更不是什么弱类型,可以说完全没有高级语言的特征,这和java或vb的开发理念有着天壤之别,VC里很多事情都要去自己控制和处理以及捕获,不然别人哪还用创建个句柄判断一次,处理个句柄再判断一次的来写代码?一个这种错误捕获不就搞定了?按这种理论随便到网上下个VC范例就应该随处可见这样的过程,难道你认为有这样的好东西别人会不用?只有你能想到?但问题是你见过有人在VC里这样用吗?事实上我看了那么多无论是官方还是非官方的代码,都没发现VC有这么个用法的。VC不会像高级语言那样有那么多自动化的东西,如自动分配内存或释放内存,自动数据类型的定义及转换等,java可以说处理起这种东西来很轻松,而VC就完全不是这么回事,对于这种东西弄不好就奔溃掉或常驻内存,所以千万不要把VC看作java,他们本质上是不同的两种开发语言,所以开发理念也是不同的。你既然原来是搞java的,开发工具换了,开发理念也是要换的,如果想用高级语言的方式去玩这种中级语言或低级语言,除了走弯路不会有什么别的收获,当然,当你绕弯路绕多了会对这种绕弯路的痛苦深有体会,可能会比别人都理解得更透彻为什么不要再这么弄,好处是什么、坏处是什么之类的,但却浪费了很多精力和时间去走这样的过程。而这种开发理念的不清晰,还会在很多问题上让你绕弯路,奉劝你应该搞清楚VC到底是什么?有什么功能和函数?别人是如何用他的?开发理念到底是什么?否则你会在很多事情上都套用这种想法,最终走回来发现VC原来应该这样用才后悔就不好了。
你可以试想一下,在汇编程序里,有没有像java或vb一样的捕获这种异常信息的方法呢?可能你会觉得很可笑,汇编怎么可能有这种应用呢?对,那你为什么就认为VC就一定有这种应用呢?难道只是因为和java的语法相似?如果只是因为这样,难道说php也和VC是一个开发理念?VC并不是高级语言,也不是什么面向对象的编程,更不是什么弱类型,可以说完全没有高级语言的特征,这和java或vb的开发理念有着天壤之别,VC里很多事情都要去自己控制和处理以及捕获,不然别人哪还用创建个句柄判断一次,处理个句柄再判断一次的来写代码?一个这种错误捕获不就搞定了?按这种理论随便到网上下个VC范例就应该随处可见这样的过程,难道你认为有这样的好东西别人会不用?只有你能想到?但问题是你见过有人在VC里这样用吗?事实上我看了那么多无论是官方还是非官方的代码,都没发现VC有这么个用法的。VC不会像高级语言那样有那么多自动化的东西,如自动分配内存或释放内存,自动数据类型的定义及转换等,java可以说处理起这种东西来很轻松,而VC就完全不是这么回事,对于这种东西弄不好就奔溃掉或常驻内存,所以千万不要把VC看作java,他们本质上是不同的两种开发语言,所以开发理念也是不同的。你既然原来是搞java的,开发工具换了,开发理念也是要换的,如果想用高级语言的方式去玩这种中级语言或低级语言,除了走弯路不会有什么别的收获,当然,当你绕弯路绕多了会对这种绕弯路的痛苦深有体会,可能会比别人都理解得更透彻为什么不要再这么弄,好处是什么、坏处是什么之类的,但却浪费了很多精力和时间去走这样的过程。而这种开发理念的不清晰,还会在很多问题上让你绕弯路,奉劝你应该搞清楚VC到底是什么?有什么功能和函数?别人是如何用他的?开发理念到底是什么?否则你会在很多事情上都套用这种想法,最终走回来发现VC原来应该这样用才后悔就不好了。
追问
首先,这个语言无关。
其次,vc6不是语言,c/c++这种,才是语言。
再次,以Delphi为例,同样是Windows下的IDE工具,同样是非java/.net级的底层语言(Pascal),它为什么可以?
try
raise Exception.Create('Error Message');
except
on e:Exception do
begin
ShowMessage(e.Message);
end;
end;
追答
它为什么可以?
因为他是 Delphi,而 Delphi 不是低或中级语言,他是 Pascal 的变种,就像 java 是 C/C++ 语言的变种一样,它属于高级语言。最简单的就是在 windows 中有类似 CreateObject 功能的东西就一定是高级语言,比如C#、VB、Delphi,哪个没有类似的东西?顺便说一下,Delphi 的是 CreateOleObject,还有就是有弱类型的也一定是高级语言,这些都是高级语言的基本标志, 但 C/C++ 是没有这些东西的,要在 C/C++ 实现这种功能难度不是一般的大。
还有,再强调一点,高级语言是有自己的运行体制的,这些体制管理着他们应用程序的运行环境,帮他们分配内存、释放内存、分配任务、调度任务等,有些东西的复杂程度甚至可以看作是一个子系统,只不过这个子系统不是运行在内核上,而是win32子系统上,就像VB,就是通过VB运行库的DLL来管理VB的运行环境,而VB的程序不是直接在Win32子系统上工作的,而是通过运行库的调度来工作的,他的进程资源、单元线程也是在VB系统里调度管理的,当VB要做这种错误捕获时,其实是依靠这种VB系统的运行环境来捕获并反馈给正在使用的单元线程。所以VB也能轻易的做这样的事情。但为什么VB程序写多线程就会有不稳定现象呢?是因为VB本身没有线程管理函数,只能靠API才能创建多线程,而通过API创建的线程是直接运行在Win32子系统下的,VB程序所有的资源都在主线程中,子线程的资源区没有相关的Basic资源,所以即使VB在线程里用点有basic特色的语句都会让程序崩溃。因为一个是Win32子系统,一个是VB运行环境,两者是不同的两个环境,甚至连开发理念都不一样,所以很多人才说VB不适合写多线程或是说VB多线程不稳定就是这么个道理。java基本上和vb是一个架构,只不过没有vb这种bug而已,所以才可以轻易的实现这样的功能,至于Borland的东西他具体是用什么样的架构我不是很清楚,但也逃不出这种运行在自己环境的理念,不然他就没法自己控制注这种自动化的过程。
而 c/c++ ,即使你用的是Borland c、DEV-C++、gcc,他们都是直接编译给系统使用的,在windows中就是基于win32子系统直接运行的程序,而这种程序基本的理念就是依赖于win32 sdk方式,当然vc和bc还各自弄了一套扩展库开发方式,如mfc、wdl 等,但只是一些类封装而已,并不是像高级语言的运行环境管理库那么复杂,所以就不会有这种功能。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询