1. C++内置的异常处理:try-catch

(1)try语句处理正常代码逻辑

(2)catch语句处理异常情况

(3)try语句中的异常由对应的catch语句处理,如果对应的catch中没有处理该异常,会自动继续沿函数调用栈向上被抛出

2. C++通过throw语句抛出异常情况

double divide(double a, double b)
{
    const double delta = 0.000000000000001;
    ;

    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
    }
    else
    {
        throw 0; //产生除0异常
    }
    return ret;
}

3. C++异常处理分析

(1)throw抛出的异常必须被catch处理

  ①当前函数能够处理异常,程序继续往下执行

  ②当前函数无法处理异常,则函数停止执行,并返回

(2)异常处理的流程:未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。

【编程实验】C++异常处理初探

#include <iostream>

using namespace std;

double divide(double a, double b)
{
    const double delta = 0.000000000000001;
    ;

    if(!((-delta < b) && (b < delta)))
    {
        ret = a / b;
    }
    else
    {
        ; //除0异常时,抛出整数0。
                 //因异常不在该函数处理,会向外层调用函数传递
    }
    return ret;
}

int main()
{
    try
    {
        //除0时由于divide函数抛出异常,而在函数内部那里又没有处理该异常,因此异常被继续抛出,到了main函数中
        //调用函数的代码之处,而在这里异常被try-catch捕获会转向catch语句中,catch处理完后,会直接转向catch
        //语句的后面"return 0;"去执行。而不是转到调用函数的下一行语句(即cout << "r = " << r << endl;)
        , );  

        cout << "r = " << r << endl;
    }
    catch(...)
    {
        cout << "Divide by zero..." << endl;
    }

    ;
}

4. 多个catch块

(1)catch语句可以定义捕获具体类型的异常(如处理int型、double型、自定义类型的异常等)

(2)不同类型的异常由不同的catch语句负责处理

(3)throw可以抛出任何类型的异常

(4)catch(…)用于处理所有类型的异常必须放在所有的catch块之后

(5)任何异常都只能被捕获(catch)一次

5. 异常处理的匹配规则

(1)异常抛出后,至上而下严格匹配每一个catch语句处理的类型。

(2)异常处理匹配时,不进行任何的类型转换。

【编程实验】异常类型匹配

#include <iostream>
#include <string>

using namespace std;

void Demo1()
{
    try
    {
        ; //1默认为整型,将从上至下严格匹配各catch,即catch(int c)
                 //如果throw 'c',将匹配catch(char c),注意不进行任何的类型转换!
    }
    catch(char c)
    {
        cout << "catch(char c):" << c << endl;
    }
    catch(short c)
    {
        cout << "catch(short c):" << c << endl;
    }
    catch(double c)
    {
        cout << "catch(double c):" << c << endl;
    }
     catch(int c)
    {
        cout << "catch(int c):" << c << endl;
    }
     catch(...)  //所有异常,必须放在所有的catch之后,因为是自上而下匹配的
    {
        cout << "catch(...)" << endl;
    }
}

void Demo2()
{
    throw "SantaClaus"; //const char*类型
    //throw string("SantaClaus"); //string类型
}

int main()
{
    Demo1(); 

    try
    {
       Demo2();
    }
    catch(char* s)
    {
        cout << "catch(char* s):" << s << endl;
    }
    catch(const char* s)
    {
        cout << "catch(const char* s):" << s << endl;
    }
    catch(string s)
    {
        cout << "catch(string s):" << s << endl;
    }   

    ;
}
/*输出结果:
catch(int c):1
catch(const char* s):SantaClaus
*/

6. 小结

(1)C++中直接支持异常处理的概念

(2)try…catch是C++中异常处理的专用语句

(3)try语句处理正常代码逻辑catch语句处理异常情况

(4)同一个try语句可以跟上多个catch语句

(5)异常处理必须严格匹配不进行任何的类型转换

第64课 C++中的异常处理(上)的更多相关文章

  1. 第65课 C++中的异常处理(下)

    1. C++中的异常处理 (1)catch语句块可以抛出异常 ①catch中获捕的异常可以被重新抛出 ②抛出的异常需要外层的try-catch块来捕获 ③catch(…)块中抛异常的方法是throw; ...

  2. C++中的异常处理(上)

    C++内置了异常处理的语法元素try... catch ...-try语句处理正常代码逻辑-catch语句处理异常情况-try语句中的异常由对应的catch语句处理 try { ,); } catch ...

  3. 关于C#中async/await中的异常处理(上)-(转载)

    在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕捉异常,而未被捕获的异常则会不断向上传递,形成一个简单而统一的错误处理机制.不过对于异步编程来说,异常处理一直是件麻烦的事情, ...

  4. 关于C#中async/await中的异常处理(上)

    关于C#中async/await中的异常处理(上) 2012-04-11 09:15 by 老赵, 17919 visits 在同步编程中,一旦出现错误就会抛出异常,我们可以使用try…catch来捕 ...

  5. 在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)

    为了能中一个系统上开发64或32位C++程序,费了些周折,现在终于能够开始干过了.在此记录此时针对Q5.4版本的32位开发环境配置过程. 1. 下载Qt 5.4 的32位版本,进行安装,安装过程中会发 ...

  6. 第17课 - make 中的路径搜索(上)

    第17课 - make 中的路径搜索(上) 1. 问题 在以往的 make 学习中,我们使用到的 .c 文件和 .h 文件都与 makefile 处在同一个路径.在实际的工程项目中,所有的源文件和头文 ...

  7. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

  8. 使用.NET 4.0+ 操作64位系统中的注册表

    一.64位系统中的注册表 以 LocalMachine 中的启动项为例: 64位应用的注册表位置还是在: SOFTWARE\Microsoft\Windows\CurrentVersion\Run 而 ...

  9. umask设置导致的weblogic中的应用上传的文件没有权限打开

    去年,在公司的某一weblogic上部署的web应用上传文件后却没有读的权限.因为weblogic在Linux上部署,上传文件是mount到了一台安装了NFS的Windows Server上. 当时本 ...

随机推荐

  1. 原型prototype

    JS对象的比较 由于JS是解释执行的语言,那么代码中出现函数与对象如果重复执行,会创建多个副本 创建一个Person构造函数,要求有name,age,gender,sayHello 代码如下: fun ...

  2. JavaScript技巧[转载]

    在这篇文章中将给大家分享12个有关于JavaScript的小技巧.这些小技巧可能在你的实际工作中或许能帮助你解决一些问题. 使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是 ...

  3. Xcode中的常用快捷键

    新建项目     com + shift +N 新建文件    com  + N 偏好设置  通用   com + , 跳到指定行 com + L 当前行加断点    com + \ 移动编辑区最上方 ...

  4. Git 撤销修改

    Git 撤销修改 增补提交 git commit –C HEAD –a --amend -C表示复用指定提交的提交留言,这个例子中是HEAD,实际上可以指定其他有效的提交名称. 如果参数是小写的-c, ...

  5. 希尔排序(Shell)

    希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序, ...

  6. Android Studio Gradle Build Running 特别慢的问题探讨

    本文的本本win7 64bit 6G android studio2.1 在运行程序的时候Gradle Build Running 特别慢,一个helloworld都快2min了 1.开启gradle ...

  7. iOS开发--Swift 基于MVC设计模式的简单的tableViewDemo

    如果说MVC是最好的设计模式, 可能很多人并不赞同, 但是如果说MVC是最主流, 应用面最广的设计模式, 我想这是毫无争议的. 不说废话, 直接演示在Swift中如何使用MVC新建工程(我并没有新建文 ...

  8. new ActiveXObject("Scripting.FileSystemObject") 时抛出异常 .

    使用JScript读写本地文件时,会使用Scripting.FileSystemObject控件. IE默认是不允许运行这类“未标记为安全执行脚本的ActiveX控件”的. 因此执行下行代码时: fs ...

  9. SQL Server日期时间格式转换字符串

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...

  10. .net 读写记事本文件

    这是读取文件的代码 StreamReader myreader = File.OpenText(_filepath);//读取记事本文件 string s = ""; s = my ...