C语言的异常处理

异常:异常(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;
}

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

时间: 2024-11-13 08:13:22

C语言的异常处理的相关文章

Go语言中异常处理painc()和recover()的用法

Go语言中异常处理painc()和recover()的用法 1.Painc用法是:用于抛出错误.Recover()用法是:将Recover()写在defer中,并且在可能发生panic的地方之前,先调用此defer的东西(让系统方法域结束时,有代码要执行.)当程序遇到panic的时候(当然,也可以正常的调用出现的异常情况),系统将跳过后面的代码,进入defer,如果defer函数中recover(),则返回捕获到的panic的值. 2.代码: package main import "fmt&q

Go语言之异常处理

在编写Go语言代码的时候,我们应该习惯使用error类型值来表明非正常的状态.作为惯用法,在Go语言标准库代码包中的很多函数和方法也会以返回error类型值来表明错误状态及其详细信息. error是一个预定义标识符,它代表了一个Go语言內建的接口类型.这个接口的类型声明如下: type error interface{ Error() string } 其中的Error方法声明的意义就在于为方法调用方提供当前错误状态的详细信息.任何数据类型只要实现了这个可以返回string类型值的Error方法

一步一步学习C#语言【异常处理】

1.异常的概念 异常是在运行期间代码中产生的错误,或者由代码调用的函数产生的错误. 示例:    int[] myArray = {1, 2, 3, 4}; myArray[4] = 5; 运行上述代码会产生如下异常信息: Index was outside the bounds of the array. 产生的异常叫做System.IndexOutOfRangeException(数组下标越界异常). 2.异常处理 C#包含结构化异常处理语法. 可以使用try.catch和finally三个

Python语言之异常处理与测试

目录 (一)异常处理 (二)测试 (一)异常处理 1.捕获所有异常 try: x = 5 / 0 except: print('程序有错误') 2.捕获特定异常 try: x = 5 / 0 except ZeroDivisionError as e: print('不能为0',e) except: print('其他错误') else: print('没有错误') finally: print('关闭资源') 3.手动抛出异常 def method(): raise NotImplemente

8、C#语言里面的异常处理

在C#语言里面的异常处理,和Java语言的异常处理,几乎是如出一辙.都是由:try.catch.finally这几个关键词组成. 第一种异常处理是由try和catch组成.举例如下: //在进行除法运算的时候,除数不能为0,否则会发生异常. try { int 除数; System.Console.Write("请输入除数:"); 除数=Convert.ToInt32(System.Console.ReadLine()); int 结果; 结果=12/除数; System.Consol

[R]R语言里的异常处理与错误控制

之前一直只是在写小程序脚本工具,几乎不会对异常和错误进行控制和处理. 随着脚本结构和逻辑更复杂,脚本输出结果的准确性验证困难,同时已发布脚本的维护也变得困难.所以也开始考虑引入异常处理和测试工具的事情. 不过好像R语言的异常处理似乎有些辣鸡?查了下资料和try的文档说明,感觉说的并不清楚. 在网上查了一些资料,对R语言异常处理做了比较详细的说明,留档作为参考.至于测试工具的问题,后续还是再考虑下. 文章链接:R语言-处理异常值或报错的三个示例 原文参考了以下几个网页: http://stacko

C 语言异常处理(五十二)

我们今天来看下异常处理,在看 C++ 的异常处理之前,先来看看 C 语言中的异常处理.那么什么是异常呢?在程序运行过程中可能会产生异常,异常(Exception)与 Bug 的区别是:异常是程序运行时可预料的执行分支,而 Bug 是程序中的错误,是不被预期的运行方式. 下来我们来看看异常和 Bug 的对比:a> 异常比如运行时产生除 0 的情况,需要打开的外部文件不存在,数组访问时越界:b> Bug 是使用野指针,堆数组使用结束后未释放,选择排序无法处理长度为 0 的数组.在 C 语言中的经典

C# 异常和异常处理

C# 语言的异常处理功能可帮助您处理程序运行时出现的任何意外或异常情况. 异常处理使用 try.catch 和 finally 关键字尝试某些操作,以处理失败情况,尽管这些操作有可能失败,但如果您确定需要这样做,且希望在事后清理资源,就可以尝试这样做. 公共语言运行时 (CLR)..NET Framework 或任何第三方库或者应用程序代码都可以生成异常. 异常是使用 throw 关键字创建的.很多情况下,异常可能不是由代码直接调用的方法引发,而是由调用堆栈中位置更靠下的另一个方法所引发. 在这

[每日一题]说说异常处理机制和最佳实践

这个问题仁者见仁智者见智,每个人心中的最佳实践不见得一致,但是你要有想法,这个很关键,如果连思考都没有思考过,那就不太好了. 很多高级语言都提供了异常处理,比如Java.Python.Ruby,比较底层的语言,比如C,没有提供异常机制,最近时兴的Golang,也没有提供通常的try-catch异常机制. 异常机制是必须的么?显然不是,因为我们通常可以用多个返回值来解决,如果语言本身不支持多返回值,那异常机制就是必须的,否则这个语言写起来真的会很痛苦,你想想是不是这样?:) 异常,故名思议,就是不