让程序在崩溃时体面的退出之SEH

Oracle ERP EBS R12 GL总帐业务方案 系统操作 本文档是Oracle ERP系统的总账管理模块使用手册,主要包含以下内容:1.系统架构设计,详细介绍多组织架构、会计科目设置等核心概念;2.总账日常操作流程,包括凭证录入、审核、过账等全流程管理;3.特殊业务处理,涵盖预算控制、内部往来、合并报表等专项功能;4.期末处理,说明月结、年结的操作步骤;5.系统设置指南,提供会计科目表、权限控制等配置说明;6.附录包含各业务模块的分录示例和系统操作图标说明。本手册适用于财务人员学习和使用Oracle ERP总账系统,重点讲解系统功能要点和实操步骤。 阅读详情

    SEH的全称是Structured Exception Handling,是Windows操作系统提供的一种异常处理方式。SEH是属于操作系统的特性,不为特定语言设计,从它的名字就能看出它是一种结构化的异常处理方式。SEH包括了2个部分:终止处理__try/__finally和异常处理__try/__except,下面分别进行介绍。

        终止处理__try/__finally
        __try/__finally可以保证无论try块内的代码执行结果如何,finally块内的代码总会被调用和执行。现在用下面的这个VC++中的控制台程序来说明。

  1. int _tmain(int argc, _TCHAR* argv[])  
  2. {  
  3.     __try  
  4.     {  
  5.         MessageBox(NULL, _T("Message from '__try' section"), _T("Test"), MB_OK);  
  6.   
  7.         // 除零,人为的使程序崩溃  
  8.         //  
  9.         int i = 13;  
  10.         int j = 0;  
  11.         int m = i / j;  
  12.     }  
  13.     __finally  
  14.     {  
  15.         // 在这里添加处理程序崩溃情况的代码  
  16.         //  
  17.   
  18.         // 这里以弹出一个对话框为例子  
  19.         //  
  20.         MessageBox(NULL, _T("Message from '__finally' section"), _T("Test"), MB_OK);  
  21.     }  
  22.   
  23.     MessageBox(NULL, _T("Funcation completed"), _T("Test"), MB_OK);  
  24.   
  25.     return 0;  
  26. }  

        编译上面的代码。运行生成的EXE,会弹出下面的对话框。

        点击OK按钮后,程序会崩溃。

        在出现上面这个对话框的时候点击Cancel,将控制权返还给程序,那么下面的对话框就会弹出。

        点击OK按钮后,程序正常退出。
        由上面的例子可以看出,无论try块中的代码会不会出现异常,在程序终止的时候,finally块中的代码都会被调用和执行。所以一般情况下,finally块中的代码都是用来做一些清理工作和资源的释放。

        异常处理__try/__except
        __try/__except是用来捕捉异常的,只有当try块中的代码出现异常的时候,except块中的代码才会被调用和执行。它的语法是这样的:

  1. __try  
  2. {  
  3.     // guarded code  
  4. }  
  5. __except(expression)  
  6. {  
  7.      // exception handler code  
  8. }  

        它最大的一个好处就是可以完全控制异常进程。expression的值决定了异常被处理完后,进程该如何执行。下面依然用VC++中的控制台程序来说明。

  1. int _tmain(int argc, _TCHAR* argv[])  
  2. {  
  3.     __try  
  4.     {  
  5.         MessageBox(NULL, _T("Message from '__try' section"), _T("Test"), MB_OK);  
  6.   
  7.         // 除零,人为的使程序崩溃  
  8.         //  
  9.         int i = 13;  
  10.         int j = 0;  
  11.         int m = i / j;  
  12.     }  
  13.     __except(EXCEPTION_EXECUTE_HANDLER)  
  14.     {  
  15.         // 在这里添加处理程序崩溃情况的代码  
  16.         //  
  17.   
  18.         // 这里以弹出一个对话框为例子  
  19.         //  
  20.         MessageBox(NULL, _T("Message from '__except' section"), _T("Test"), MB_OK);  
  21.     }  
  22.   
  23.     MessageBox(NULL, _T("Funcation completed"), _T("Test"), MB_OK);  
  24.   
  25.     return 0;  
  26. }  

        编译上面的代码。运行生成的EXE,会依次弹出下面的对话框。

        可以看出,在异常处理代码被调用执行后(except块中的代码),程序继续可以继续运行,并正常退出,并没有崩溃!通过使用__try/__except可以捕捉到任何类型的异常,并保证程序不会崩溃!(想想这是多么的神奇,一个程序永远不会崩溃!)
        下面解释一下except中表达式各个值的含义:

EXCEPTION_CONTINUE_SEARCH        异常没有被处理,继续向上抛出。如果更上层的代码没有异常捕捉机制,程序就会崩溃。
EXCEPTION_CONTINUE_EXECUTION   异常已经被处理,返回异常发生的地方继续执行。
EXCEPTION_EXECUTE_HANDLER        异常已经被处理,程序继续往后执行。

        通过上面的例子可以知道,SEH的异常处理跟C++的异常处理不同,C++的try/catch不能控制异常进程,对于异常,要么处理,要么继续向上抛出。而SEH却能完全控制异常进程,处理完异常之后,还能决定进该进程如何执行。只要SEH运用得当,编写一个永不崩溃的应用程序成为可能。但是SEH有一个致命的弱点,那就是它是一种结构化的异常处理,所以不支持面向对象。下面用具体的VC++控制台程序来说明。

  1. // 一个有函数调用的类  
  2. //   
  3. class CrashTest  
  4. {  
  5. public:  
  6.     CrashTest() {}  
  7.     ~CrashTest() {}  
  8.   
  9.     void Test()   
  10.     {   
  11.         Crash();   
  12.     }  
  13.   
  14. private:  
  15.     void Crash()   
  16.     {   
  17.         // 除零,人为的使程序崩溃  
  18.         //  
  19.         int i = 13;  
  20.         int j = 0;  
  21.         int m = i / j;  
  22.     }  
  23. };  
  24.   
  25. int _tmain(int argc, _TCHAR* argv[])  
  26. {  
  27.     __try  
  28.     {  
  29.         CrashTest test;  
  30.         test.Test();  
  31.     }  
  32.     __except(EXCEPTION_EXECUTE_HANDLER)  
  33.     {  
  34.         // 在这里添加处理程序崩溃情况的代码  
  35.         //  
  36.     }  
  37.   
  38.     return 0;  
  39. }  

        上面的代码不能通过编译,VC++编译器会给出这样的错误信息:error C2712: Cannot use __try in functions that require object unwinding。错误原因很简单,try块内使用了对象。
        要想解决这个问题,可以把使用对象的逻辑放到一个函数里,然后在try里调用这个函数,来骗过编译器。把上面的代码修改成下面这样就可以通过编译。

  1. void Test()  
  2. {  
  3.     CrashTest test;  
  4.     test.Test();  
  5. }  
  6.   
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.     __try  
  10.     {  
  11.         Test();  
  12.     }  
  13.     __except(EXCEPTION_EXECUTE_HANDLER)  
  14.     {  
  15.         // 在这里添加处理程序崩溃情况的代码  
  16.         //  
  17.     }  
  18.   
  19.     return 0;  
  20. }  
双目相机标定理论与编程实现 双目相机标定是计算机视觉中的重要任务,通过确定双目相机的内参和外参,可以实现立体视觉的深度感知和三维重建。通过使用OpenCV库提供的函数,我们可以方便地进行双目相机的标定工作。双目相机标定是计算机视觉中的重要任务,用于确定双目相机的内参和外参,以实现立体视觉的深度感知和三维重建。通过上述代码,我们可以获得左右相机的内参矩阵、畸变系数、旋转矩阵和平移矩阵等参数,从而完成双目相机的标定过程。使用双目相机采集一系列左右相机的图像,确保标定板在不同位置和角度下都能被双目相机拍摄到。函数来检测标定板的角点。 阅读详情

相关推荐

多模态数据集对比:MicroLens、PixelRec和Amazon在电商推荐中的表现差异

本文深入对比了三大主流多模态数据集MicroLens、PixelRec和Amazon在电商推荐中的表现差异。通过实际测试数据,分析了这些数据集在冷启动处理、模态融合、稀疏性挑战等关键场景下的真实表现,为算法工程师和研究员提供实用指南。特别关注多模态数据集的选择对推荐系统效果的影响,帮助开发者优化模型性能。

weixin_28717939的博客 418

【逆向工程核心原理:SEH】

reverse

qq_42363151的博客 1823

华硕天选3 win11+ubuntu20.04双硬盘双系统配置(包括ubuntu重启后无法成功进入、没有wifi图标的设置)

1、制作系统盘 2、分区 3、重启电脑按F2

baidu_38431960的博客 1万+

Cannot use __try in functions that require object unwinding

原因:在同一个函数里还存在C++的异常处理。C++的异常处理不能与windows的结构化异常处理在同一个函数里。 解决方案:将要用windows结构化异常处理保护的代码单独放在一个函数里。 void Func1() { __try {   Func2(); } __finally { //do something }

hello_Albert的专栏 2253

renderdoc的使用

renderdoc可以用来捕获帧渲染情况,排查一些GPU渲染、资源规格等问题。 下面讲述一些该软件连接真机调试使用。 一、下载安装renderdoc 软件的下载地址:https://renderdoc.org/可直接点击下载即可。该软件是开源免费的,不用破解。 下载后直接安装即可使用。 二、打开使用renderdoc 打开界面后,默认的界面布局如下图所示,(这里我已经设置了黑色主题,可以忽略这点),renderdo中主要的窗口有Texture Viewer(纹理查看器)、Event B.

x_xingduo_2315的博客 2万+

宽带阻抗匹配的工程实现-第一步,端口驻波仿真

其实阻抗匹配我工作以来经常说,也经常做,但是基本上都是直接在印制板上进行调试。现在想先用仿真软件直接设计出来,才发现很多东西嘴上说容易,想做出来太难了。所以准备写一些文章,记录一下碰到的问题。

pp_0604的博客 2376

error C2712: Cannot use __try in functions that require object unwinding

Compile Errors Error error C2712: Cannot use __try in functions that require object unwinding 中文的意思:无法在需要展开对象的函数中使用try //some code like this void testTry() { std::thread threadA(&function1); //b...

shongbee2的专栏 814

手把手教你用VCS+Verdi在Linux下仿真蜂鸟E203 RISC-V核(附波形调试技巧)

本文详细介绍了在Linux环境下使用VCS和Verdi工具链对蜂鸟E203 RISC-V核进行仿真验证的完整流程。从环境配置、工程结构解析到VCS编译优化和Verdi波形分析技巧,提供了实战性强的调试方法和性能优化策略,帮助工程师高效完成数字IC验证工作。

weixin_42531163的博客 416

SEH的EXCEPTION_CONTINUE_EXECUTION

因为工作需要,又要研究一下C++的Exception机制,用MSVC的话,自然又要了解一下Windows的Standard Exception Handling(简称SEH,不是SHE),实际上MSVC的Exception机制就是基于SEH的。 在这个链接(http://51cmm.csai.cn/ExpertEyes/No159.htm)上,介绍了一下SEH在VC中的体现,就是__try

2558

【信号与系统】Multisim 仿真信号合成与分解

软件 Multisim 进行方波信号的产生、分解和合成,观察信号波形的分解与合成,加深对信号频谱的理解。

AXYZdong的博客 2万+

YOLOv11改进 | 主干/Backbone篇 | 利用目标检测轻量化网络MobileNetV2替换Backbone(yolov11系列全系轻量化)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。其在MobilNetV1的基础上采用反转残差结构和线性瓶颈层。这种结构通过轻量级的深度卷积和线性卷积过滤特征,同时去除狭窄层中的非线性,以维持表征能力。MobileNetV2在性能上和精度上都要比V1版本强很多,其在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中都展现了一定的有效性。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、MobileNetV2的框架原理。

Snu77的博客 2844

让程序在崩溃时体面的退出之SEH+Dump文件

《让程序在崩溃时体面的退出》系列文章的第五篇,在程序中使用SEH捕捉到异常的时候创建Dump文件。

寒星轩 7507

小白也能懂!一步步教你用FPGA加速YOLO目标检测(入门篇)

安装到 PYNQ 开发板中。该库为 PYNQ 平台提供了对量化神经网络(如 YOLO)的硬件加速支持。确保你的电脑已连接到外网,如 WiFi 或热点(手机热点理论上也可用,未实测)。当你看到安装成功的提示后,打开 Jupyter Notebook,你会发现在。趁这个机会,泡了杯茶,刷了会儿手机,顺便感慨了一下开源社区的强大……页面中多出了一些新的项目文件夹 —— 这就是我们刚才安装的。参数,浅拷贝只克隆最近一次提交,减少数据量,避免超时问题。初始化,打开该文件,即可运行我们的Tiny YOLO。

FJN110的博客 1597

[转]让程序在崩溃时体面的退出之SEH

原文地址:http://blog.youkuaiyun.com/starlee/article/details/6636723 SEH的全称是Structured Exception Handling,是Windows操作系统提供的一种异常处理方式。SEH是属于操作系统的特性,不为特定语言设计,从它的名字就能看出它是一种结构化的异常处理方式。SEH包括了2个部分:终止处理__try...

aozhi2719的博客 182

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

[转]让程序在崩溃时体面的退出之SEH+Dump文件

原文地址:http://blog.youkuaiyun.com/starlee/article/details/6649605 在我上篇文章《让程序在崩溃时体面的退出之SEH》中讲解了SEH中try/except可以捕捉异常,避免程序的崩溃,并且可以在处理完异常之后,还能决定进该进程如何执行。对于应用程序的使用者来说,并不知道异常的发生。但是对于软件的开发者来说,虽然避免了程序的...

aozhi2719的博客 171

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

让程序在崩溃时体面的退出之终极解决方案(SEH+Dump+Unhandled Exception Filter)

在我的上篇文章《让程序在崩溃时体面的退出之SEH+Dump文件》我介绍了怎样用SEH加上Dump文件来避免程序的崩溃并在程序崩溃时创建Dump文件来帮助定位出现异常的代码行。可是只有try/except块中try块中的代码出现异常才能被捕捉到,try块外面的代码出现异常,程序照样会崩溃。         下面用《让程序在崩溃时体面的退出之SEH+Dump文件》文中的代码为例子来说明。

穷途末路 841

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 让程序在崩溃时体面的退出之Unhandled Exception
下一篇: C++多继承中重写不同基类中相同原型的虚函数
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值