解析一下C++的异常处理

简介: 解析一下C++的异常处理

4edc953e2c684bbe819ffa954c899c08.png

作者:良知犹存

转载授权以及围观:欢迎添加微信:Allen-Iverson-me-LYN

总述

   在程序运行过程中经常会碰到一些问题,例如数组下标越界,除数为零等,这些错误不过能被发现处理,则我们的代码很有可能会导致程序崩溃。所以我们一般会针对可能导致程序崩溃的错误进行预测,C与C++都可以做。

   但是C的判断代码要和相关函数执行的位置紧邻,甚至要紧密的耦合。而C++引入了错误处理机制,使得执行程序与错误检测的代码可以分离开,这样我们就可以安心的在单独的写代码,多次调用某个函数,而仅在某一处编写错误处理的代码即可。

   异常提供了一种转移程序控制权的方式,涉及到C++异常处理的几个关键词有:

throw :当问题出现时,程序会抛出一个异常的标志,这个抛出异常的动作就是由throw关键词完成的。

catch:在我们处理问题的地方,通过异常处理程序捕获异常。catch关键字用于捕获异常。

try: try块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个catch块。


一、throw

抛出异常

使用 throw 语句在代码块中的任何地方抛出异常。throw 语句的操作数可以是任意的表达式,表达式的结果的类型决定了抛出的异常的类型。可以抛出变量也可以抛出函数

void C(int i)
{
    int    a =1;
    double b =1.2;
    float  c = 1.3;
    if(i ==0)
    {
        cout<<"in C ,it is OK"<<endl;
    }
    else if(i==1)
    {
        throw a;
    }
    else if(i==2)
    {
        throw b;
    } 
    else if(i==3)
    {
        throw c;
    }
    else if(i==4)
    {
        throw Myexception();
    }
    else if(i==5)
    {
        throw MySubexception();
    }      
}


二、try与catch

捕获异常

catch 块跟在 try 块后面,用于捕获异常。我们可以指定想要捕捉的异常类型,这是由 catch 关键字后的括号内的异常声明决定的。

void A(int i)
{
    try{
        B(i);
    }catch(int t)
    {
        cout<<"catch int excepting  "<<t<<endl;
    }catch(double d)
    {
        cout<<"catch double excepting  "<<d<<endl;
    }catch(MySubexception &e){
        e.waht();
    }catch(Myexception &e){
        e.waht();
    }
    catch(...)
    {
        cout<<"catch other excepting  "<<endl;
    }
}

 如果你想让 catch 块能够处理 try 块抛出的任何类型的异常,则必须在异常声明的括号内使用省略号 ...,如下所示:

    catch(...)
    {
        cout<<"catch other excepting  "<<endl;
    }

  哪段代码可能发生错误,就把代码放入try中,catch进行捕捉。发生的代码片段用throw命令进行定义错误代码。

   而一旦发生异常,中断程序执行,直接进入catch捕获。捕获的时候,先捕获小范围的,后捕获大范围的。

 

三、测试示例

#include <iostream>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
/*通过throw命令 抛出整型 浮点等,类与派生类,然后进行catch*/
using namespace std;
class Myexception{
public:
    void waht(void){cout<<"this is Myexception"<<endl;}
};
class MySubexception :public Myexception{
public:
    void waht(void){cout<<"this is MySubexception"<<endl;}
};
void C(int i)
{
    int    a =1;
    double b =1.2;
    float  c = 1.3;
    if(i ==0)
    {
        cout<<"in C ,it is OK"<<endl;
    }
    else if(i==1)
    {
        throw a;
    }
    else if(i==2)
    {
        throw b;
    } 
    else if(i==3)
    {
        throw c;
    }
    else if(i==4)
    {
        throw Myexception();
    }
    else if(i==5)
    {
        throw MySubexception();
    }      
}
void B(int i)
{
    cout<<"call C..."<<endl;
    C(i);
    cout<<"After call C..."<<endl;
}
void A(int i)
{
    try{
        B(i);
    }catch(int t)
    {
        cout<<"catch int excepting  "<<t<<endl;
    }catch(double d)
    {
        cout<<"catch double excepting  "<<d<<endl;
    }catch(MySubexception &e){
        e.waht();
    }catch(Myexception &e){
        e.waht();
    }
    catch(...)
    {
        cout<<"catch other excepting  "<<endl;
    }
}
int main(int argc,char** argv)
{
    int i;
    if(argc !=2)
    {
        cout<<"Usage: "<<endl;
        cout<<argv[0]<<" <0|1|2|3> "<<endl;
        return -1;
    }
    i = strtoul(argv[1],NULL,0);/*转化为整型*/
    A(i);
    return 0;
}

4edc953e2c684bbe819ffa954c899c08.png

这就是我分享的C++的异常处理,里面代码是实践过的,如果大家有什么更好的思路,欢迎分享交流哈。

目录
相关文章
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
11月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
226 4
|
12月前
|
C语言 C++ 开发者
【c++】异常处理
本文深入探讨了C++中的异常处理机制,从基础概念到实际应用进行全面解析。首先介绍了异常的作用及优势,相比C语言的错误码方式,C++通过抛出对象实现更全面的错误处理。接着分析了异常的使用方法,包括`try-catch`结构、异常传播与捕获规则,以及栈展开的过程。文章还讨论了异常安全问题,如内存泄漏和资源清理,并引出智能指针的解决方案。此外,介绍了C++11的`noexcept`规范和标准库异常体系,帮助开发者构建更健壮的应用程序。最后总结了异常的优点与潜在问题,为后续学习智能指针埋下伏笔。
321 15
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
安全 编译器 C语言
【C++篇】深度解析类与对象(中)
在上一篇博客中,我们学习了C++类与对象的基础内容。这一次,我们将深入探讨C++类的关键特性,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载、以及取地址运算符的重载。这些内容是理解面向对象编程的关键,也帮助我们更好地掌握C++内存管理的细节和编码的高级技巧。
|
存储 程序员 C语言
【C++篇】深度解析类与对象(上)
在C++中,类和对象是面向对象编程的基础组成部分。通过类,程序员可以对现实世界的实体进行模拟和抽象。类的基本概念包括成员变量、成员函数、访问控制等。本篇博客将介绍C++类与对象的基础知识,为后续学习打下良好的基础。
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
|
11月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
441 12
|
9月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
235 0

推荐镜像

更多
  • DNS