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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 解析一下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++的异常处理,里面代码是实践过的,如果大家有什么更好的思路,欢迎分享交流哈。

目录
相关文章
|
2月前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
2月前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
60 1
|
2月前
|
存储 程序员 C++
深入解析C++中的函数指针与`typedef`的妙用
本文深入解析了C++中的函数指针及其与`typedef`的结合使用。通过图示和代码示例,详细介绍了函数指针的基本概念、声明和使用方法,并展示了如何利用`typedef`简化复杂的函数指针声明,提升代码的可读性和可维护性。
111 1
|
2月前
|
运维 数据库连接 PHP
PHP中的异常处理机制深度解析####
本文深入探讨了PHP中异常处理机制的工作原理,通过实例分析展示了如何有效地使用try-catch语句来捕获和处理运行时错误。我们将从基础概念出发,逐步深入到高级应用技巧,旨在帮助开发者更好地理解和利用这一强大的工具,以提高代码的稳定性和可维护性。 ####
|
2月前
|
PHP 开发者 UED
PHP中的异常处理机制解析####
本文深入探讨了PHP中的异常处理机制,通过实例解析try-catch语句的用法,并对比传统错误处理方式,揭示其在提升代码健壮性与可维护性方面的优势。文章还简要介绍了自定义异常类的创建及其应用场景,为开发者提供实用的技术参考。 ####
|
2月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####
|
3月前
|
自然语言处理 编译器 Linux
|
3月前
|
数据库连接 PHP 开发者
PHP中的异常处理机制深度解析####
本文深入探讨了PHP中异常处理的核心概念、使用场景及最佳实践,旨在帮助开发者更高效地管理和响应运行时错误。通过实例演示和理论分析,揭示try-catch块的运作原理,以及如何自定义异常类以增强代码的可读性和可维护性。文章还对比了传统错误处理方式与异常处理的优势,为读者提供了在复杂项目中实施健壮错误管理策略的指导。 ####
|
3月前
|
设计模式 安全 数据库连接
【C++11】包装器:深入解析与实现技巧
本文深入探讨了C++中包装器的定义、实现方式及其应用。包装器通过封装底层细节,提供更简洁、易用的接口,常用于资源管理、接口封装和类型安全。文章详细介绍了使用RAII、智能指针、模板等技术实现包装器的方法,并通过多个案例分析展示了其在实际开发中的应用。最后,讨论了性能优化策略,帮助开发者编写高效、可靠的C++代码。
64 2
|
3月前
|
API PHP 数据库
PHP中的异常处理机制深度解析与最佳实践####
本文深入探讨了PHP中异常处理机制的核心概念、工作原理及其在现代Web开发中的应用。通过剖析try-catch结构、自定义异常类及异常的继承体系,揭示了如何高效地捕获、处理并管理运行时错误,以提升应用的稳定性和用户体验。文章还结合实例,分享了在实际项目中实施异常处理的最佳实践,帮助开发者构建更加健壮的PHP应用程序。 ####

热门文章

最新文章

推荐镜像

更多