有没有人知道标准c++对系统异常捕捉是怎么作的,比如对除0异常是怎么处理的

lu_zi 2004-10-20 11:35:04
有没有人知道标准c++对系统异常捕捉是怎么作的,比如对除0异常是怎么处理的
...全文
534 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lu_zi 2004-10-21
  • 打赏
  • 举报
回复
那我要是想在不同的平台上实现这个除0捕捉,就必须自动去写相关平台代码了,有没有什么每三方c++类库可以作到这个啊,呵呵
xuzheng318 2004-10-20
  • 打赏
  • 举报
回复
现在进入下一步,这仍然是基于代码的步骤。(除了在极少数的情况下,你不能老是使用系统内建的除错器,所以知道其他可以找出这些麻烦的虫子的办法总是个好主意)。本步骤完全是关于如何做到,更重要的是处理好在你的窗体出现异常时系统扔给你的(产生的)错误。在C++标准得到认可前黑暗的旧日子里,应用程序通常会通过返回值来发出错误信号(这种方法在OLE和一些WINAPI函数中仍在使用)。很显然,你可以很轻易的忽略这些(事实上也是经常的,我的意思是你经常检查一个WINAPI函数的返回值吗?)。

所以他们决定….,okay,我们需要一个新的机制,一个你不能忽略的。但你可以处理,定制(自定义 customize)。异常就此出现了。想要一个特殊的错误类型标志?容易的很,定义一个新的异常类型(不过是一个类,没别的),抛出来(产生这个异常)。完了。

例子:

class MyException

{ public:

AnsiString iMessage;

MyException(AnsiString Message) { iMessage=Message;}

};

throw new MyException(“Test Exception Message”);

就这么简单!(当然不是很完全,我会很快加上的)。漂亮而又简单,并且非常容易定制来满足您的需要。Okey,你会问到:“我能产生异常了,但如何处理它们?我的意思是,我想在第一时间(位置)从我的代码中排除异常!”这当然很容易做到,实际上还很容易定制呢!标准委员会为我们定义了try {/* code */} catch (...) {/* code */ }机制,跟异常机制一样,它完全可以定制来满足您的需要!只需把您的执行代码段放在try模块中就行了,您还需要一个catch( ) 或 __finally 模块来告诉程序(如果)得到一个异常的时候作什么。现在就是你这么做的好处,你定义了一个类class类型并且输入变量来捕捉异常-通过声明catch( )。(在前面的例子中,应该是这样-catch(MyException &E) { /*在这里书写捕捉到异常后的处理代码*/})为了让这个系统更有力,你可以建立完整的子类继承树。这样当你捕捉基类时你可以捕捉所有从这个基类继承的异常类型(VCL中一个很好的例子就是所有的异常都是从Exception类继承而来的,所以catch(Exception& E) 将捕捉所有的VCL异常,当然包也括您所产生的。但EsocketError除外,见xiphias在http://www.bytamin-c.com/ 的howto (若你不喜欢E文的话,我会尽快翻译)。记住这个想法,我会在以后另一个步骤详细说明)。要让它再有力一些的话,标准委员会决定包括如下的声明catch(…) ,没错括号中就是三个点。此声明允许我们捕捉任何异常,我的意思是所有的异常。还想再有力一些?当然可以,你可以用附加的catch( )声明,跟if..else if…的样子差不多。这里要牢牢记住!如果你捕捉到了一个异常类型,那么以后就它不会被再次捕捉到了!所以先看下面的代码…

Try

{

// 程序的正常运行代码

}

catch(EDBEngineError &E)

{

// 处理基于数据库引擎的错误

}

catch(EExternalError &E)

{

//通常处理基于windows的错误

}

catch(Exception &E)

{

// 处理所有其他的VCL错误

}

你可以看到,这里按照 "是EDBEngineError吗? 是->处理,不是?->继续捕捉" "是EexternalError吗? 是-> 处理, 不是?-> 继续下一次捕捉" 等等… 这样的顺序排列。

接着还有更多的内容。如果你希望对某个异常做些什么,又不希望异常就此消失,你可以重新抛出(产生)这个异常。它将继续向后寻找新的catch()过程来处理它。我不能说我经常这么做。但最好应该知道,就象“抛出”一样简单。就是这样,throw将带着已经被你处理过的异常继向后寻找另一个catch来处理它。

最后而不是最不重要的 (这部分不包括在标准规范中,倒更象是Borland专有的增加版)就是 __finally 声明,使用一个 __finally{ } 模块,你可以指定不管有否异常产生都将运行的代码。这里是清除你通过new方法分配的局部变量及将所有应该设定回正常状态的标志复位(例如将一个等待状态的鼠标指针复位成正常状态)的最方便的地方。

呸,太多了!休息一下吧,有空可以看一看C++Builder帮助中的Exception类, (所有E开头的,你会注意到它们都是从Exception类继承来的。这也是定制你自己的异常类的好练习!) 当你回来时,我们将进入下一步旅程。
  • 打赏
  • 举报
回复
基本上在我们破手机上就是coredump了.
  • 打赏
  • 举报
回复
好像标准没有规定.Linux是信号,WIN32下是一个 EXCEPTION_FLT_DIVIDE_BY_ZERO 的SEH异常.
pc2s 2004-10-20
  • 打赏
  • 举报
回复
比如除零异常,是会产生一个信号(signal)。就像程序退出时产生的SIGINT一样。
我记得除零好像是SIGNUM?
nicknide 2004-10-20
  • 打赏
  • 举报
回复
呵呵,楼上说的对,这个在windows系统中属于SEH结构化异常,而C++的标准只能够捕获由自己所抛出的异常,而且,C++的异常是非2进制兼容的,也就是说,用VC写的模块抛出的异常,BC写的模块很可能就无法捕捉到……
北极猩猩 2004-10-20
  • 打赏
  • 举报
回复
标准库里可能有一些相关的标准异常类


没有!这种错误在C++中是不能检测出来的。不同的硬件和系统会对除0,空指针之类的错误有不同的反应,所以C++标准中是不会规定类似的处理方式的
kenyle 2004-10-20
  • 打赏
  • 举报
回复
占座。
whoho 2004-10-20
  • 打赏
  • 举报
回复
可以尝试看源代码的
whoho 2004-10-20
  • 打赏
  • 举报
回复
标准库里可能有一些相关的标准异常类
北极猩猩 2004-10-20
  • 打赏
  • 举报
回复
对于楼主说的这类情况(除0,空指针),C++标准中并没有规定处理方式,因为对于这些情况的处理是和系统及硬件相关的。所以,在C++中不能使用异常去布或类似的错误。
不过在Windows系统下,可以使用Windows系统的结构化处理来处理这类问题,不过这是和系统相关的

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧