社区
C++ 语言
帖子详情
有没有人知道标准c++对系统异常捕捉是怎么作的,比如对除0异常是怎么处理的
lu_zi
2004-10-20 11:35:04
有没有人知道标准c++对系统异常捕捉是怎么作的,比如对除0异常是怎么处理的
...全文
534
11
打赏
收藏
有没有人知道标准c++对系统异常捕捉是怎么作的,比如对除0异常是怎么处理的
有没有人知道标准c++对系统异常捕捉是怎么作的,比如对除0异常是怎么处理的
复制链接
扫一扫
分享
转发到动态
举报
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类继承来的。这也是定制你自己的异常类的好练习!) 当你回来时,我们将进入下一步旅程。
DiabloWalkOnTheEarth
2004-10-20
打赏
举报
回复
基本上在我们破手机上就是coredump了.
DiabloWalkOnTheEarth
2004-10-20
打赏
举报
回复
好像标准没有规定.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系统的结构化处理来处理这类问题,不过这是和系统相关的
C++
11:
异常
的捕获和
处理
异常
是一种
处理
错误的方式,当一个函数发现自己无法
处理
的错误时就可以抛出
异常
,让函数的直接或间接的调用者
处理
这个错误。
C++
之
异常
处理
实际中都会自定义自己的
异常
体系进行规范的
异常
管理, 因为一个项目中如果大家随意抛
异常
, 那么外层的调用者就没办法
处理
了, 所以实际中都会定义一套继承的规范体系.这样大家抛出的都是继承的派生类对象, 捕获一个基类就可以了如果每个小组分别负责数据库模块, 缓存模块, 业务模块, 每个小组都会抛出
异常
, 但是每个小组抛出的
异常
类型又不同, 如果一起在main函数里面进行
捕捉
的话就会非常的多并且非常的复杂, 并且每个小组所抛出的
异常
都有着自己的模块的属性, 所以使用一个类来解决这里的
异常
就不现实.
C++
异常
捕获
C++
异常
的捕获机制
C++
面向对象(三)
异常
:
异常
概念、
异常
的匹配规则、
异常
安全、
异常
体系
目录C语言传统的错误
处理
方法
异常
的概念
异常
的匹配规则
异常
安全
异常
规范
异常
体系
C++
标准
库的
异常
体系自定义
异常
体系 C语言传统的错误
处理
方法 在C语言中,因为没有
异常
这个机制,所以出现错误时一般都是以下方式解决 终止程序,例如断言assert,当出现错误时,就会调用一个exit()或者abort()终止程序。 缺点:直接终止程序,而问题并没有得到
处理
,用户使用效果差 错误码,例如大部分系统接口的正确返回0,错误返回1,而原本需要返回的数值一般放在参数中。也有一些是用全局变量errno来标记错误。 缺点:需
排查
C++
软件
异常
的常见思路与方法(实战经验总结)
在多年排查
C++
软件
异常
实践的基础上,系统地总结了排查
C++
软件
异常
的常见思路与方法,有很强的实战参考价值!
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章