C语言异常处理机制——为您的C程序添加异常处理

作者在 2006-10-03 08:23:00 发布以下内容
C语言异常处理机制——为您的C程序添加异常处理
[ 2006-9-26 1:23:00 | By: ChenMo ]

 

转自:

 
 
ChenMo 的编程博客
http://chenmo.bc-cn.net



C语言异常处理机制——为您的C程序添加异常处理

1、什么是异常

        异常一般指的是程序运行期(Run-Time)发生的非正常情况。
        异常一般是不可预测的,如:内存不足、打开文件失败、范围溢出等。
        UNIX 使用信号给出异常,并当发生异常时转跳到信号处理过程进行异常处理。DOS下的信号对比UNIX系统而已相对较少。
        C标准库提供两个特殊的函数:setjmp() 及 longjmp(),这两个函数是结构化异常的基础,正是利用这两个函数的特性来实现异常。
        所以,异常的处理过程可以描述为这样:
        首先设置一个跳转点(setjmp() 函数可以实现这一功能),然后在其后的代码中任意地方调用 longjmp() 跳转回这个跳转点上,以此来实现当发生异常时,转到处理异常的程序上,在其后的介绍中将介绍如何实现。
        setjmp() 为跳转返回保存现场并为异常提供处理程序,longjmp() 则进行跳转(抛出异常),setjmp() 与 longjmp() 可以在函数间进行跳转,这就像一个全局的 goto 语句,可以跨函数跳转。
        举个例子,程序在 main() 函数内使用 setjmp() 设置跳转,并调用另一函数A,函数A内调用B,B抛出异常(调用longjmp() 函数),则程序直接跳回到 main() 函数内使用 setjmp() 的地方返回,并且返回一个值。

2、jmp_buf 异常结构

        使用 setjmp() 及 longjmp() 函数前,需要先认识一下 jmp_buf 异常结构。jmp_buf 将使用在 setjmp() 函数中,用于保存当前程序现场(保存当前需要用到的寄存器的值),jmp_buf 结构在 setjmp.h 文件内声明:

        typedef struct
        {
                unsigned j_sp;  // 堆栈指针寄存器
                unsigned j_ss;  // 堆栈段
                unsigned j_flag;  // 标志寄存器
                unsigned j_cs;  // 代码段
                unsigned j_ip;  // 指令指针寄存器
                unsigned j_bp; // 基址指针
                unsigned j_di;  // 目的指针
            &nbs

高手们的杰作 | 阅读 1198 次
文章评论,共0条
游客请输入验证码