C++异常的几种捕获方式

Wesley13
• 阅读 637

捕获指定的类型

这样的话可以对每种异常做出不同的处理,例如:

#include <iostream>

using namespace std;

void A(int n){
    int a = 1;
    float b = 0.2;
    double c = 0.3;

    if(n == 1)
        throw a;
    else if(n == 2)
        throw b;
    else if(n == 3)
        throw c;
}

int main()
{
    int test;

    while(cin >> test){
        try{
            A(test);
        }catch(int i){
            cout << "Catch int exception " << i << endl;
        }catch(float i){
            cout << "Catch float exception " << i << endl;
        }catch(double i){
            cout << "Catch double exception " << i << endl;
        }
}

    return 0;
}

捕获泛型

如果想捕获全部类型异常的话,C++ 提供了一种简便的做法,在 catch 子句的异常声明中使用省略号来作为异常声明,例如:

void function(){  
    try {  
        /* your code */  
    }catch(...) {  
        /* handler */
    }
}

捕获类

例如:

#include <iostream>

using namespace std;

class Base{
public:
    void name(){
        cout << "My name is Base" << endl;
    }
};

void A(){
    throw Base();
}

int main()
{
    try{
        A();
    }catch(Base &e){
        e.name();
    }

    return 0;
}

也可以捕获 Base 的子类,并且在 Base 类的成员函数前加 virtual 实现多态,这样的话就可以调用子类的 name 方法,例如:

#include <iostream>

using namespace std;

class Base{
public:
    virtual void name(){
        cout << "My name is Base" << endl;
    }
};

class Derived : public Base{
public:
    void name(){
        cout << "My name is Derived" << endl;
    }
};

void A(){
    throw Derived();
}

int main()
{
    try{
        A();
    }catch(Base &e){
        e.name();
    }

    return 0;
}

捕获未期望的异常

可以在函数名后用 throw 来声明该函数可能抛出的异常,例如:

#include <iostream>

using namespace std;

void A() throw (int, float)
{
    int a = 1;
    float b = 0.2;
    double c = 0.3;

    throw c;
}

int main()
{
    try{
        A();
    }catch(...){
        cout << "Catch exception" << endl;
    }

    return 0;
}

但是,如果函数抛出的异常类型未在声明范围内的话,程序就会发生崩溃:

运行结果:

terminate called after throwing an instance of 'double'
Aborted (core dumped)

即使你使用了 catch(...) ,但它也捕获不到,异常会继续向上汇报,最终被系统默认的函数进行处理。

但我们可以使用 set_unexpected (unexpected_handler func) 这个函数来修改默认的处理方法,来实现自己的处理方式。

未实现捕获的异常

假如函数抛出一个 double 的异常,但在我们捕获的函数中没有实现 double 类型的捕获,当然也没有使用 catch(...),这种情况和未期望的异常差不多,它也会上报系统,调用系统默认的处理函数。同样我们也可以更改这个默认函数,使用如下方法:

terminate_handler set_terminate (terminate_handler func)

示例程序:

#include <iostream>

void exception(){
    std::cout << "my_terminate" << std::endl;
}

int main()
{
    std::set_terminate(exception);

    throw 0;

    return 0;
}

运行结果:

my_terminate
Aborted (core dumped)
点赞
收藏
评论区
推荐文章
浩浩 浩浩
3年前
【Flutter实战】Dart线程模型及异常捕获
2.6Flutter异常捕获在介绍Flutter异常捕获之前必须先了解一下Dart单线程模型,只有了解了Dart的代码执行流程,我们才能知道该在什么地方去捕获异常。2.6.1Dart单线程模型在Java和ObjectiveC(以下简称“OC”)中,如果程序发生异常且没有被捕获,那么程序将会终止,但是这在Dart或JavaScript中则不会!
Easter79 Easter79
3年前
springboot2.x如何配置全局自定义异常
为什么要捕获异常?我们开发中,经常运行时,代码会报错,这时候我们有可能抛出异常,而不是用try..catch来解决.而且现在前后端分离,如果不捕获异常的话,前端那边的人估计会被报的错搞得焦头烂额的.springboot2.x是怎么自定义异常的?怎么捕获异常的?我们自定义异常类,需要继承一个RuntimeExceptio
Wesley13 Wesley13
3年前
Java中return返回结果的优先级
在Java开发时,异常处理是非常普遍的。先看这样一道关于异常处理的代码publicstaticintgetNumer(){inta1;try{returna;}catch(Exceptione){
Stella981 Stella981
3年前
Python异常捕获与处理
一、任务描述  本实验任务主要对Python异常进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python异常的基本操作。并对异常的基本操作进行整理并填写工作任务报告。二、任务目标1、掌握Python异常的捕获2、掌握Python异常的处理三、任务环境Ubuntu16.04、Python2.7
Stella981 Stella981
3年前
SpringBoot过滤器中的异常处理
在昨天的文章我跟大家分享了SpringBoot中异常的处理中,我说了一个需要注意的点,就是过滤器中抛出的异常无法被异常处理类捕获,然后这个朋友就问应该如何处理。其实处理这种问题的处理方式有好几种,那么我就简单分享一下我近期一个项目中的处理方式。Filter中的异常处理思路首先我们要明白,在过滤器中我们一般是不会写很长
Easter79 Easter79
3年前
SpringBoot过滤器中的异常处理
在昨天的文章我跟大家分享了SpringBoot中异常的处理中,我说了一个需要注意的点,就是过滤器中抛出的异常无法被异常处理类捕获,然后这个朋友就问应该如何处理。其实处理这种问题的处理方式有好几种,那么我就简单分享一下我近期一个项目中的处理方式。Filter中的异常处理思路首先我们要明白,在过滤器中我们一般是不会写很长
小万哥 小万哥
1年前
C++异常和错误处理机制:如何使您的程序更加稳定和可靠
在C编程中,异常处理和错误处理机制是非常重要的。它们可以帮助程序员有效地处理运行时错误和异常情况。本文将介绍C中的异常处理和错误处理机制。什么是异常处理?异常处理是指在程序执行过程中发生异常或错误时,程序能够捕获并处理这些异常或错误的机制。例如,当
小万哥 小万哥
8个月前
C++ 异常处理机制详解:轻松掌握异常处理技巧
C异常处理C异常处理机制允许程序在运行时处理错误或意外情况。它提供了捕获和处理错误的一种结构化方式,使程序更加健壮和可靠。异常处理的基本概念:异常:程序在运行时发生的错误或意外情况。抛出异常:使用throw关键字将异常传递给调用堆栈。捕获异常:使用