第64课 C++中的异常处理(上)

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;
    double ret = 0;

    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;
    double ret = 0;

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

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

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

    return 0;
}

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
    {
        throw 1; //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;
    }   

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

6. 小结

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

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

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

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

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

时间: 2024-10-11 04:10:26

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

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

1. C++中的异常处理 (1)catch语句块可以抛出异常 ①catch中获捕的异常可以被重新抛出 ②抛出的异常需要外层的try-catch块来捕获 ③catch(…)块中抛异常的方法是throw;也是将所有异常重新抛出 (2)catch块中重新抛异常的意义 ①可以被外层try-catch块捕获,并重新解释异常的信息. ②工程开发中使用这样的方式统一异常类型 A.假设我们的私有库使用到了第3方的库函数,如func. B.但其抛出的异常类型为int*类型,很不友好.我们可以在私有库使用func的

C++--第25课 - 异常处理 - 上

第25课 - 异常处理 - 上 1. 典型问题一 所有的代码都有可能不按照预定的方式进行 double Div(double a, double b) {    return a / b;} double Add(double a, double b) {    return a + b;} double Minus(double a, double b) {    return a - b;} double Multi(double a, double b) {    return a * b

Java闭关修炼64课 很适合新手学习的JAVA视频教程

Java闭关修炼64课 很适合新手学习的JAVA视频教程 java闭关修炼第一课 什么是java(1).rar  java闭关修炼第一课 什么是java.rar  java闭关修炼第七课 基础语言要素(1).rar  java闭关修炼第七课 基础语言要素.rar  java闭关修炼第三十一课 静态方法(1).rar  java闭关修炼第三十一课 静态方法.rar  java闭关修炼第三十七课 成员初始化顺序讨论(1).rar  java闭关修炼第三十七课 成员初始化顺序讨论.rar  java闭

64位汇编第二讲——64位汇编中局部变量使用及抬栈方法29171230

一.纯写64位汇编时局部变量处理和参数寄存器保存位置 纯写64位汇编和用VS2013写64位C代码生成的汇编会有一些格式上的区别,VS2013写64位C代码生成的汇编中是没用到栈基址寄存器rbp的,但是纯写汇编时只要申明了参数和使用了@LOCAL定义的局部变量,就会用到rbp.且看如下例子:1)用C写64位程序空函数生成的汇编代码, ;C代码 void FunTest2() { } ;汇编代码 000000013F753290 40 57 push rdi 000000013F753292 5F

Spark3000门徒第9课IDEA中开发Spark实战总结

今晚听了王家林老师的第9课IDEA中开发Spark实战,课后作业是:在Idea中编写广告点击排名的程序并提交集群测试, IDEA社区版本就够用,Ultimate没必要还要钱 程序如下: object WordCountCluster { def main(args: Array[String]){ /** * 第一步:创建spark的配置对象SparkConf,设置Spark程序的运行时的配置信息 * */ val conf = new SparkConf() //创建SparkConf对象 c

项目中java异常处理

一.java异常类介绍. Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类. 有一篇比较好的blog,http://blog.csdn.net/hguisu/article/details/6155636 介绍java异常. 二.异常处理方式. 在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常. 三.程序中使用. 2种处理方式 1.throw new 异常  在方法体上写throws

在64位Windows Server 2008 R2上安装mtools

在64位Windows Server 2008 R2上安装mtools 该安装向导提供了循序渐进的指南,用于在Microsoft Windows Server 2008 R2上安装mtools. 前提 Windows Powershell需要被安装. 该主机必需能访问互联网. 安装步骤 1. 下载和安装Python 2.7.x(当前版本2.7.10) a) 进入https://www.python.org/downloads/ b) 选择最新的2.7.x目录. c) 下载Windows x86-

C++、Java、JavaScript中的异常处理(Exception)

编程思想之异常处理 什么叫异常处理? 什么叫异常(Exception)?顾名思义就是非正常的情况,出现了不希望出现的意外,异常处理就是遇到这种意外时准备的对策和解决方案.比如您开着一辆劳斯莱斯在公路上行走,突然前面出现一个小孩,幸好您眼疾手快紧急刹车,而避免了一场交通事故.在这个例子中突然出现的小孩就是异常,紧急刹车就是异常处理(面对这种突发情况采取的解决方案). 程序来源于现实,是现实的抽象和模拟,也会有异常,因此异常的处理就显示的极为重要.试想如果您的手机的某个应用使用两下就崩溃了,或都出现

编写高质量代码改善C#程序的157个建议——建议85:Task中的异常处理

建议85:Task中的异常处理 在任何时候,异常处理都是非常重要的一个环节.多线程与并行编程中尤其是这样.如果不处理这些后台任务中的异常,应用程序将会莫名其妙的退出.处理那些不是主线程(如果是窗体程序,那就是UI主线程)产生的异常,最终的办法都是将其包装到主线程上. 在任务并行库中,如果对任务运行Wait.WaitAny.WaitAll等方法,或者求Result属性,都能捕获到AggregateException异常.可以将AggregateException异常看做是任务并行库编程中最上层的异