一、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 alongjmp call, it returns thevalue argument oflongjmp, or if thevalue argument oflongjmp 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 == .)
    {
        longjmp(buf, );        // throw
    }
    else
        return a / b;
}

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

分析一下,首先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 == .)
    {
        throw ;        // throw
    }
    else
        return a / b;
}

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

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

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

参考:

C++ primer 第四版
Effective C++ 3rd

[转贴]从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介的更多相关文章

  1. [置顶] Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)

    无论在Window应用程序,还是Web应用程序以对用户友好的方式显示运行时的异常都是很有必要,尤其对于可能有很多不确定因素导致异常的Web应用程序;在传统的Web开发中,处理异常的方式——设计专门一个 ...

  2. [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开

    一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...

  3. 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

    一.C语言错误处理方法 1.返回值(if … else语句判断错误) 2.errno(linux 系统调用) 3.goto语句(函数内局部跳转) 4.setjmp.longjmp(Do not use ...

  4. Java从零开始学十九(异常)

    一.什么是异常 从字面上讲,就是不正常的现实就是异常. 程序中的异常也是要在程序运行中才会偶尔发生.如果程序还没有运行,编译就报错,这种不叫异常,这种叫编译错误,通常是语法上的错误 二.java中异常 ...

  5. MSDN Webcast 跟我一起从零开始学WCF系列课程

    系列课程 >跟我一起从零开始学WCF系列课程   跟我一起从零开始学WCF系列课程(1):WCF概述 (Level 200)   讲 师:徐长龙    课程简介:从 本堂课开始我们将开启一个新的 ...

  6. 68. 使用thymeleaf报异常:Not Found, status=404【从零开始学Spring Boot】

    [从零开始学习Spirng Boot-常见异常汇总] 我们按照正常的流程编码好了 controller访问访问方法/hello,对应的是/templates/hello.html文件,但是在页面中还是 ...

  7. 61. mybatic insert异常:BindingException: Parameter 'name' not found【从零开始学Spring B】

    mybatic insert异常:BindingException: Parameter 'name' not found [从零开始学习Spirng Boot-常见异常汇总] 异常信息如下: nes ...

  8. (5)全局异常捕捉【从零开始学Spring Boot】

    在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...

  9. 从零开始学 Java - 我放弃了 .NET ?

    这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...

随机推荐

  1. 使用ViewState[""]传递Hashtable的值

    //首先定义Hashtable myHach = new Hashtable(); //添加键值到Hashtable中myHash.Add("ServiceType1", &quo ...

  2. webstorm 如何修改背景颜色

    http://www.cnblogs.com/zxyun/p/4744744.html 见文章底部有图文说明 15个必须知道的chrome开发者技巧(GIF):http://www.wtoutiao. ...

  3. 关于安卓应用(APK文件)的二次打包

    http://blog.csdn.net/baiyuliang2013/article/details/40426681 很多开发者,不管是个人或是公司都不太注重自己开发的应用的安全性,即是 否会被不 ...

  4. 那天有个小孩跟我说LINQ(七)转载

    1  LINQ TO XML(代码下载)        准备:新建项目 linq_Ch7控制台程序,新建一个XML文件夹,我们就轻松地学习一下吧          XDocument         ...

  5. mysql嵌套查询

    select * from(select t.`name` `name`,count(*) count from company t group by t.`name`) aa where aa.co ...

  6. 【失败】制作CentOS镜像

    1.在vmware上安装centos虚拟机,安装过程中设置CPU时,点选 虚拟化Intel VT-x~ 和 虚拟化CPU性能计数器,网络使用NAT模式 2.#mkdir /opt/iso,上传镜像(用 ...

  7. 锋利的Jquery解惑系列(二)------插件开发大总结

    申明:插件开发是实际项目就经常用到的,不过也是挺吃力的.笔者自己做项目时,看着我们老大写的jQuery一头桨糊,那叫个痛苦.后面果断买了本参考书以及浏览别人的博客,现在也算慢慢入门了.现在总结自己的一 ...

  8. linux - 创建用户

    apt-get update apt-get upgrade root@iZ28t2p7lz9Z:~# adduser cuiAdding user `cui' ...Adding new group ...

  9. Eclipse相关

    JDK版本更换相关: 启动eclipse会报错:根据报错信息后面提示的eclipse配置信息,我将配置中的c:/xx/javaw.exe给移除了.并在eclipse.ini中配置了-vm d:/Jav ...

  10. cp 命令参数

    cp命令         该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大.         语法: cp [选项] 源文件或目录 目标文件或目录 ...