异常处理方法

原创 2003年08月29日 07:42:00

异常处理方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

1. Windows SEH 与 C++ Exception

1)      Windows SEH 结构化异常

结构化异常是Windows操作系统提供的与语言无关的异常处理机制, SHE使用Win32API中的RaiseException()函数来抛出异常,在VC中使用关键字__try和关键字__except来捕获,并用宏函数GetExceptionCode和GetExceptionInfo来获取捕获的异常由什么原因产生,和产生异常时环境状态。__finally关键字保证无论是否发生异常,finally代码段都会被执行。

SHE使用示例代码

int ECode;

输出结果:

2发生异常,Code=1

2)      C++Exception

C++标准也提供了一种异常处理机制,通过使用try,catch,throw关键字来表达,在C++异常可以通过throw函数来抛出简单变量,复杂变量与异常对象,与Windows异常相比,异常对象可以给开发者提供更多的信息。

3)      SEH 到 C++异常的转换

在同一个程序中,如果使用WIN32API它会抛出SHE,使用C++库函数,它们又会抛出C++异常,Win32API和C++函数混和使用时如果使用两种异常捕获机制时,使用起来会影响程序的可读性,因此C++运行库提供了_set_se_translator函数,在SHE异常发生时通过回调方式来转换SEH异常为C++异常。在此提供一个转换的宏来实现转换。

转换宏的代码:

#define INSTALL_SEHCONVERT() ExceptionConvert ecExceptionConvert

class SEHException

{

private:

             unsigned int nSE;

public:

             SEHException() {}

    SEHException( unsigned int n ) : nSE( n ) {}

             ~SEHException() {}

    unsigned int getSeNumber() { return nSE; }

};

class ExceptionConvert

{

public:

         ExceptionConvert(){OldFanc = _set_se_translator(trans_func); }

         ~ExceptionConvert(){_set_se_translator(OldFanc); }

private:

                  static void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp )

         {

                      throw SEHException(u);

         }

         _se_translator_function OldFanc;

};

使用上面INSTALL_SEHCONVERT宏后就可以使用如下代码来捕获SHE异常了

INSTALL_SEHCONVERT();

Try

{

        

}

catch(SEHException &seh){

  

}

2. 同步异常与异步异常

1) VC的C++ Exception 采用两种模式捕获异常:同步模式和异步模式。VC的工程的调试版本缺省使用异步模式,工程的发布版本缺省使用同步模式。在同步模式下,VC的编译器假定代码中只有在显示使用throw和调用函数的时候才会引发异常,因此,在同步模式下,VC编译出的代码比较小,但在这种模式下,try-catch对不能捕获内存访问异常与算术除零异常等。在异步模式下,VC的编译器为try块内的每一条语句生成异常捕获代码,在这种情况下,他能够捕获全部的异常,还能保证栈上对象在解栈中正确释放。为了要在发行版本中也能够捕获全部异常就需要打开异步模式,但代价是程序编译出代码变大,运行速度变慢。

2)编译选项:

同步模式的编译选项为/EHs或者/GX(等同于/EHsc)

异步模式的编译选项为/EHa

3. 多线程下的异常捕获

在创建线程并运行线程的函数中把创建线程的代码放在try块中并不会捕获到线程函数中发生的异常,线程函数中发生的异常只能在线程函数中捕获。并且每一个线程都需要自己的SHE转换宏。转换宏可以放在线程函数的开始部分

4.参考MSDN库

异常的处理方式

在登陆中异常的处理: package com.tarena.netctoss.dao; import java.sql.Connection; import java.sql.PreparedSta...
  • wangqing84411433
  • wangqing84411433
  • 2017年06月12日 21:35
  • 205

C--异常处理

程序消亡的一般形式: (1)无疾而终(即就是正常退出,例如return 0、点击图标按钮直接退出) (2)自杀(例如:abort()、exit(0)) > abort()函数:引发不正常进程的终止,...
  • qq_36221862
  • qq_36221862
  • 2017年03月28日 19:55
  • 92

Java基础<异常机制>总结(异常体系、Exception特点、异常处理方式)

基础篇之《异常机制》 @author :kern --------------------------------------------------------------------- ...
  • Kern_
  • Kern_
  • 2014年08月19日 20:00
  • 628

NFC framework introduce

NFC framework introduce   1 NFC 简介 对于NFC,是google在android4.0上推出来的,简单介绍下。近场通讯(NFC)是一系列短距离无线技术...
  • myxmu
  • myxmu
  • 2014年08月07日 19:46
  • 1066

《Python核心编程》第3章 习题

3–10. 异常。使用类似readTextFile.py 中异常处理的方法取代 readTextFile.py,makeTextFile.py 中对os.path.exists() 的调用。反过来, ...
  • birdzb
  • birdzb
  • 2014年05月08日 21:44
  • 1546

用js处理图片加载错误时加载默认图片的方法

jspjs代码 function onfind(img){ img.src="/front/images/logo_wutu.jpg"; img.onerror=null; } ...
  • m0_37505412
  • m0_37505412
  • 2017年06月14日 18:34
  • 255

Java常见异常原因以及解决方案

Java常见异常原因以及解决方案一、ConcurrentModificationException(转)单线程 异常原因 在使用迭代器Iterator进行遍历时,进行了remove操作。(其他增删操...
  • yangnan0110
  • yangnan0110
  • 2017年04月20日 18:31
  • 216

Java捕获异常处理的常用方法有哪些? java 学习

在Java中,异常情况分为Exception(异常)和Error(错误)两大类,Java异常通常是指程序运行过程中出现的非正常情况,如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等,对于...
  • lmseo5hy
  • lmseo5hy
  • 2018年01月19日 17:19
  • 51

java学习过程中的异常处理方式

这两天在学习java基础中的异常,可能是以前在学校的时候没弄清楚,而且参加工作了以后在asp.net的开发中也很少用到,所以这两天学习java基础的过程中,感觉有些困难,所以在这里记录总结一下 首先,...
  • menghanshi
  • menghanshi
  • 2015年01月29日 19:27
  • 541

程序开发中异常的处理方式

在开始这篇文章之前我先声明一下:这不是一篇讲述如何捕获异常的文章,更没有过多的代码阐述,而是根据自身经验讲述一种开发过程中常见的异常处理方式。到底是什么意思呢?不妨用一个例子来帮助阐述。 在实际开发...
  • jianxin160
  • jianxin160
  • 2010年09月26日 14:01
  • 4908
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:异常处理方法
举报原因:
原因补充:

(最多只允许输入30个字)