C++异常处理 try,catch,throw,finally的用法

C++异常处理 try,catch,throw,finally的用法

在C++中,异常处理机制是一种用于处理程序运行时出现错误的机制。当程序发生错误时,通常会中断其继续执行。异常处理机制能够使程序有机会处理这些错误,并继续执行而不崩溃。

try-catch块

在C++中,异常处理块包括try-catch块和finally块。try-catch块是一个用来捕捉并处理异常的块。在try块中,如果有代码引发了异常,则会将控制流转移到与其匹配的catch块。catch块中则可以处理异常,或者将该异常传递给调用其的函数。

语法:

try {
    // 包含可能引发异常的代码
}
catch(ExceptionType e) {
    // 处理异常的代码
}

在上述语法中,try块中是可能引发异常的代码,如果在执行这些代码时引发了异常,那么程序就会跳转到与其匹配的catch块中处理该异常。e是异常类型的名称,可以根据需要更改。可以有多个catch块来捕捉不同类型的异常。

示例1

#include <iostream>
using namespace std;

int main() {
    int dividend, divisor, quotient;
    cout<<"Enter dividend: ";
    cin >> dividend;
    cout<<"Enter divisor: ";
    cin >> divisor;
    try {
        if(divisor == 0) {
            throw "Division by zero";
        }
        quotient = dividend / divisor;
        cout << "Quotient = " << quotient << endl;
    }
    catch(const char* msg) {
        cerr << msg << endl;
    }
    return 0;
}

在上述代码中,我们通过输入分子和分母,计算它们的商。try块中的语句可能会引发“Divison by zero”异常,因此我们检查除数是否为0。如果除数为0,我们抛出一个异常,阻止程序崩溃。然后,我们捕捉该异常并输出错误信息。

输出:

Enter dividend: 10
Enter divisor: 0
Division by zero

示例2

#include<iostream>
#include<cstring>
using namespace std;

void fun(int n)
{
    try
    {
        int* array = new int[n];
        throw "An exception occurred";
        delete[] array;
    }
    catch(const char* msg)
    {
        cerr << "Exception: " << msg << endl;
    }
}

int main()
{
    fun(0);
    return 0;
}

在上述代码中,我们使用new运算符为数组分配内存。然后,我们抛出一个异常并捕捉它。该程序会输出以下内容:

Exception: An exception occurred

throw语句

throw语句被用来在程序执行期间抛出异常。抛出给定类型的异常时,将在try块中查找一个catch块。如果能找到,则由匹配的catch块进行处理。

语法:

throw ExceptionType;

在上述语法中,ExceptionType是异常类型的名称,可以根据需要更改。

示例3

#include<iostream>
#include<cstring>
#include<stdexcept>
using namespace std;

double divide(int dividend, int divisor)
{
    if(divisor == 0)
    {
        throw runtime_error("Division by zero");
    }
    return static_cast<double>(dividend)/divisor;
}

int main()
{
    int dividend, divisor;
    cout<<"Enter dividend: ";
    cin>>dividend;
    cout<<"Enter divisor: ";
    cin>>divisor;

    try
    {
        double quotient = divide(dividend, divisor);
        cout<<"quotient = "<<quotient<<endl;
    }
    catch(runtime_error e)
    {
        cerr<<"Exception: "<<e.what()<<endl;
    }
    return 0;
}

在上述代码中,我们使用throw语句抛出一个运行时错误,当除数为0时会抛出该异常。然后,我们捕捉该异常并输出错误消息。

输出:

Enter dividend: 10
Enter divisor: 0
Exception: Division by zero

异常传递

我们可以从一个函数抛出异常,并在调用该函数的函数中捕获该异常。因此,在程序中,异常可以传递给调用方的程序块。如果未捕捉异常,它会一直传播到调用程序的下一级,直到被处理为止。

示例4

#include<iostream>
#include<cmath>
using namespace std;

void my_sqrt(double n)
{
    if(n < 0)
    {
        throw "Negative argument is not allowed";
    }
    cout<<"sqrt("<<n<<") = "<<sqrt(n)<<endl;
}

void process(double n)
{
    try
    {
        my_sqrt(n);
    }
    catch(const char* msg)
    {
        cerr<<"Exception caught: "<<msg<<endl;
    }
}

int main()
{
    process(16);
    process(-25);
    return 0;
}

在上述代码中,my_sqrt()函数用于计算平方根。如果函数的参数为负数,则会抛出一个异常,该异常将被传递给在调用my_sqrt()的主函数中。然后,我们捕捉该异常并输出错误消息。

输出:

sqrt(16) = 4
Exception caught: Negative argument is not allowed

finally块

finally块是一个可选的块,用于在try-catch块中的代码执行完后进行清理工作。无论是否引发异常,finally块中的代码都会被执行。

语法:

try
{
    // 代码,可能会引发异常
}
catch(ExceptionType e)
{
    // 处理异常
}
finally
{
    // 清理代码,无论是否引发异常都会执行
}

在上述语法中,如果执行try块中的代码时引发了某个异常,程序将跳转到与其匹配的catch块中进行处理,然后执行finally块中的代码。如果try块中的代码未引发异常,则会直接执行finally块中的代码。

示例5

#include<iostream>
using namespace std;

void do_something(bool flag)
{
    try
    {
        if(flag)
        {
            throw "An exception occurred";
        }
        cout<<"Doing something..."<<endl;
    }
    catch(const char* msg)
    {
        cerr<<"Exception: "<<msg<<endl;
    }
    finally
    {
        cout<<"Finalizing..."<<endl;
    }
}

int main()
{
    do_something(true);
    cout<<endl;
    do_something(false);
    return 0;
}

在上述代码中,我们定义了一个do_something()函数,该函数根据传入的flag值来决定是否引发异常。如果引发了异常,程序将跳转到catch块中进行处理,然后执行finally块中的代码。如果未引发异常,则仅执行finally块中的代码。

输出:

Exception: An exception occurred
Finalizing...

Doing something...
Finalizing...

以上为C++异常处理机制用法攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++异常处理 try,catch,throw,finally的用法 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • spring boot配置拦截器代码实例

    下面我将为你详细讲解如何实现Spring Boot配置拦截器的完整攻略。 1. 准备工作 首先,你需要创建一个Spring Boot项目,可以使用Spring Initializr快速生成模板。然后,你需要在pom.xml文件中添加spring-boot-starter-web和spring-boot-starter-test依赖。 2. 创建拦截器 在Sp…

    Java 2023年5月26日
    00
  • Eclipse+Java+Swing实现学生成绩管理系统的实例代码

    一、准备工作1.安装JDK和Eclipse2.新建Java Project,导入swing.jar。 二、创建GUI界面创建JFrame并添加组件。包括JLabel、JButton、JTextField、JTable、JScrollPane等。实现添加、删除、修改、查询功能。 示例说明:1. 添加功能需要获取用户输入的学生信息,通过JTextField组件获…

    Java 2023年5月19日
    00
  • MyBatis批量添加数据2种实现方法

    以下是MyBatis批量添加数据2种实现方法的完整攻略。 1. 方式一:foreach元素进行插入 在MyBatis中,我们可以使用foreach元素实现批量插入。具体步骤如下: 在MyBatis的Mapper配置文件中,编写插入语句,并使用foreach元素将多个数据插入到表中。示例代码如下: <insert id=”batchInsert”>…

    Java 2023年5月20日
    00
  • Spring MVC基于注解的使用之JSON数据处理的方法

    下面是关于Spring MVC基于注解的使用之JSON数据处理的方法的详细攻略: 1. 前置知识 在学习JSON数据处理前,需要掌握一些Spring MVC的基础知识,包括: Spring框架的基本概念和原理 Spring MVC框架的基本原理 Spring MVC框架中的Controller、RequestMapping注解 2. JSON数据处理 2.1…

    Java 2023年5月26日
    00
  • Java web实现购物车案例

    以下是“Java web实现购物车案例”的完整攻略: 1. 准备工作 首先,我们需要一些工具来实现Java web开发。具体来说,需要安装并配置以下软件:* JDK(Java Development Kit)* Tomcat服务器* Eclipse开发环境* MySQL数据库 2. 数据库设计 购物车需要记录商品和购买数量等信息,因此我们需要在MySQL数据…

    Java 2023年6月15日
    00
  • JSP之plugin的使用

    当我们在使用JSP开发Web应用时,通常需要和一些第三方的插件或库进行交互。在JSP中,可以通过使用plugin标签来实现这一功能。本文将详细讲解JSP之plugin的使用方法,包括以下内容: plugin标签的基本用法 plugin标签的属性 示例说明 1. plugin标签的基本用法 plugin标签的基本用法如下所示: <jsp:plugin t…

    Java 2023年6月15日
    00
  • Java加密解密和数字签名完整代码示例

    首先我们需要明确几个概念:加密、解密、数字签名。 加密:将明文(未加密的数据)通过某种方式转换成密文(已加密的数据),使得未授权的第三方无法读取到数据内容。 解密:将密文还原成明文,使得有授权的第三方可以读取数据内容。 数字签名:对数据进行加密后再生成一个签名,用于验证数据的来源和完整性。 下面我们分别讲解 Java 中的加密解密和数字签名的完整代码示例。 …

    Java 2023年5月19日
    00
  • Java实现读取及生成Excel文件的方法

    生成Excel文件可以使用Apache POI库,读取Excel文件可以使用JXL或者Apache POI库。 使用Apache POI进行Excel文件读取及生成 要使用Apache POI进行Excel文件处理,需要添加以下maven依赖: <dependency> <groupId>org.apache.poi</grou…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部