码迷,mamicode.com
首页 > 编程语言 > 详细

C语言的异常处理

时间:2019-05-14 19:05:04      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:返回值   div   val   str   程序   static   turn   oid   exception   

异常:异常(Exception)是可预料的执行分支,bug是不可被预料的执行分支

异常:除以0,数组访问越界。

bug: 使用野指针,申请内存没有释放。

 C语言异常处理方法:

int setjump(jmp_buf env)  :将上下文保存在jmp_buf结构体

void longjump(jmp_buf env , int val)  :从jmp_buf结构体中恢复setjump()保存的上下文。最终从setjmp()函数调用点返回,返回值为val。

 破坏了C语言的执行顺序

 

#include <iostream>
#include <string>
#include <csetjmp>

using namespace std;

static jmp_buf env;  // 定义上下文保存变量

double divide(double a, double b)
{
    const double delta = 0.000000000000001;
    double ret = 0;
    
    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
    }
    else
    {
        longjmp(env, 1);  // 根据env的内容恢复程序上下文,也就是跳到setjmp那里,再将setjmp()返回值设置为1
    }
    return ret;
}

int main(int argc, char *argv[])
{   
    if( setjmp(env) == 0 )   // 将当前程序上下文保存到env里面,直接setjmp调用返回指为0
    {
        double r = divide(1, 0); 
        cout << "r = " << r << endl;
    }
    else
    {
        cout << "Divided by zero..." << endl;
    }   
    return 0;
}

 

C语言的异常处理

标签:返回值   div   val   str   程序   static   turn   oid   exception   

原文地址:https://www.cnblogs.com/zsy12138/p/10863752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!