一、C语言错误处理方法

1、返回值(if … else语句判断错误)
2、errno(linux 系统调用)
3、goto语句(函数内局部跳转)
4、setjmp、longjmp(Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. )

#define _JBLEN  16

typedef _JBTYPE  jmp_buf[_JBLEN];

Saves the current state of the program.

int setjmp(jmp_buf env
);

 Parameters
env

Variable in which environment is stored.

 Return Value

Returns 0 after saving the stack environment. If setjmp returns as a result of a longjmp call, it returns the value argument of longjmp, or if the value argument of longjmp is 0,setjmp returns 1. There is no error return.

Restores stack environment and execution locale.

void longjmp( jmp_buf env, int value
);

 Parameters
env

Variable in which environment is stored.

value

Value to be returned to setjmp call.

C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
#include <stdio.h>
#include <setjmp.h>

jmp_buf buf;

double Divide(double a, double b)
{
    if (b == 0.0)
    {
        longjmp(buf, 1);        // throw
    }
    else
        return a / b;
}

int main(void)
{
    int ret;
    ret = setjmp(buf);
    if (ret == 0)           // try
    {
        printf("division ...\n");
        printf("%f\n", Divide(5.0, 0.0));
    }
    else if (ret == 1)      // catch
    {
        printf("divisiong by zero\n");
    }
    return 0;
}

分析一下,首先setjump设置成功返回0,执行Divide函数,除数为0,longjump跳回到setjump处,返回参数1,故继续输出

divisiong by zero, setjump和longjump 已经是c++异常的雏形,即使Divide函数本身没有调用longjump,而是调用了某个函数,在这个函数内longjump,也可以跳转到setjump 处,这样就不用通过一层层的函数返回值来判断错误。

C语言的出错处理被认为是紧耦合的,函数的使用者必须在非常靠近函数调用的地方编写错误处理代码,这会使得其变得笨拙以及难以使用。

二、C++异常处理方法(throw, try, catch)

错误处理代码的编写不再冗长乏味,并且不再与“正常”代码混在一起。程序员可以将注意力集中于正常流程,然后在某个区域里编写异常处理代码。如果多次调用同一个函数,只需在一个地方编写一次错误处理代码。
错误不能被忽略。

C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
#include <iostream>
using namespace std;

double Divide(double a, double b)
{
    if (b == 0.0)
    {
        throw 1;        // throw
    }
    else
        return a / b;
}

int main(void)
{
    try         // try
    {
        cout << "division ..." << endl;
        cout << Divide(3.0, 1.0) << endl;
        cout << Divide(5.0, 0.0) << endl;

}
    catch (int)     // catch
    {
        cout << "divisiong by zero" << endl;
    }
    return 0;
}

即无论在多远throw,都可以被catch到,但需要注意的是类型需要匹配,下面的文章将讨论抛出自定义类型的异常。

参考:

C++ primer 第四版
Effective C++ 3rd
C++编程规范

转载于:https://www.cnblogs.com/alantu2018/p/8471124.html

C语言错误处理方法、C++异常处理方法(throw, try, catch)简介相关推荐

  1. python中语法错误-Python语法错误与异常及异常处理方法

    回顾 在Python进阶记录之基础篇(二十)中,我们介绍了Python面向对象中的类方法和静态方法,以及类中拥有特殊功能的魔法函数.需要重点掌握类方法和静态方法的概念和基本用法,理解魔法函数的作用冰女 ...

  2. R语言错误信息及相关解决方法

    原创:黄小仙 Error: object of type 'closure' is not subsettable 对象大于被取子集,看看对象是不是空的,有时候文件路径或者名称不对,数据并没有导入成功 ...

  3. 《C语言程序设计:问题与求解方法》——3.9节常见编程错误

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.9节常见编程错误,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 3.9 ...

  4. php7自定义异常处理,基于PHP7错误处理与异常处理方法(详解)

    PHP7错误处理 PHP 7 改变了大多数错误的报告方式.不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出. 这种 Error 异常可以像 Exception 异常一 ...

  5. C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

    本文可解决的问题: 在一个头文件.h中定义一个结构体,在另一个.h文件中使用这个结构体引发错误 C2143    语法错误: 缺少")"(在"*"的前面) (编 ...

  6. Java中的常用异常处理方法

    觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速找出异常处理的六个问题吗? 1 OutputStreamWriter out = ... 2 ...

  7. TwoRavens配置的完整过程及异常处理方法

    TwoRavens配置的完整过程及异常处理方法 TowRavens是开源项目Dataverse用到的数据可视化统计的API, 其主界面很简单,就是一个html,数据的可视化实现依赖javascript ...

  8. 《C语言程序设计:问题与求解方法》——3.8节不同类型数据之间的类型转换

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第3章,第3.8节不同类型数据之间的类型转换,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号 ...

  9. 《C语言程序设计:问题与求解方法》——1.4节本章习题

    本节书摘来自华章社区<C语言程序设计:问题与求解方法>一书中的第1章,第1.4节本章习题,作者:何 勤,更多章节内容可以访问云栖社区"华章社区"公众号查看 本章习题 一 ...

最新文章

  1. java.lang.OutOfMemoryError: Java heap space的解决办法
  2. 【转】Win7、Ubuntu双系统正确卸载Ubuntu系统--不错
  3. FAST UA API
  4. oracle asm之添加和修改asm磁盘组
  5. 图片跟着鼠标_刷完几百张网易云Banner,我发现了2个PPT图片处理的大招!
  6. 2017年我国智能卡行业市场现状及发展趋势分析
  7. 如何修改远程桌面连接3389端口
  8. PoE交换机的选择和使用注意事项介绍
  9. 给matlab图加图注,matlab学习5-数据可视化4-gai.ppt
  10. UNITY3d在移动设备上的一些优化实战(一)-概述
  11. [ExtJS] ExtJS颜色选择器
  12. 工程师思维(简化版)——聪明人的10个工程思维
  13. Specificity and sensitivity
  14. 一、运维概述与操作系统概述
  15. java中jsp是什么_JSP是什么?
  16. html5图片并排显示图片,HTML5 - 并排显示项目
  17. chrom浏览器flash_谷歌浏览器怎么打开flash_最新版chrome怎么开启flash-win7之家
  18. html加载背景图片
  19. Spring源码学习(三)-- 底层架构核心概念解析
  20. 网络操作系统和应用服务器考点,网络操作系统与应用服务器配置

热门文章

  1. echo中使用逗号和句号的区别
  2. 用ibatis.net简单的数据更新
  3. 在VC++中访问和修改系统注册表
  4. 第六计 / Explosive City (2004)
  5. 分治法在求解“最近对”问题中的应用(JAVA)
  6. word和html互换,word与html互转(2) -- html转word
  7. 企业微信:腾讯的“佛系”办公江湖
  8. SpringCloud 入门教程(八): 断路器指标数据监控Hystrix Dashboard 和 Turbine
  9. 最优化学习笔记(五)——牛顿法(多维数据)
  10. App 运营的指标具体都有哪些?