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中如何获取request的方法汇总及其线程安全性分析

    获取request对象在Spring应用程序中是一种常见的需求。下面是Spring中获取request的方法的总结及其线程安全性分析: 1.通过@ControllerAdvice注解的类获取request对象 @ControllerAdvice public class MyControllerAdvice { /** * 获取HttpServletRequ…

    Java 2023年5月20日
    00
  • Java实战房屋租赁网的实现流程

    以下是我对于Java实战房屋租赁网的实现流程的详细讲解: 实现流程 1. 需求分析 在开始实现之前,需要进行需求分析,确定网站的主要功能和用户需求,以便于更好地实现网站。需要考虑以下问题: 用户需要哪些功能?例如:房屋的浏览、搜索、下单、支付等功能。 网站需要哪些信息?例如:用户信息、房屋信息、订单信息等。 网站的业务流程是怎样的?例如:用户搜索房屋-&gt…

    Java 2023年6月16日
    00
  • SpringBoot自动配置原理分析

    Spring Boot自动配置原理分析 Spring Boot是一个流行的Java框架,可以帮助开发人员快速构建和部署应用程序。其中最重要的特性之一是自动配置,它可以根据应用程序的依赖关系自动配置应用程序。在本文中,我们将详细讲解Spring Boot自动配置的原理和实现方式。 自动配置原理 Spring Boot的自动配置原理基于Spring框架的条件注解…

    Java 2023年5月15日
    00
  • java如何使用Lombok更优雅地编码

    Java开发中,有很多操作都是重复而无聊的,例如get/set方法的编写。通过使用Lombok,可以在编码时更加优雅,省去这些重复的部分。下面是Java如何使用Lombok更优雅地编码的完整攻略: 1. 安装Lombok 首先在Maven中,添加Lombok的依赖: <dependency> <groupId>org.projectl…

    Java 2023年5月20日
    00
  • Java实现Excel导入导出数据库的方法示例

    下面是Java实现Excel导入导出数据库的方法示例的完整攻略: 一、Excel导入数据库: 首先,需要添加相关的依赖包,如以下示例代码所示: <!– poi组件 –> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&…

    Java 2023年5月20日
    00
  • jsp简单自定义标签的forEach遍历及转义字符示例

    JSP(JavaServer Pages)是一种动态网页编程语言,旨在简化 HTML、Java Servlet 和 JavaBeans 之间的 web 应用程序的创建和维护。自定义标签是 JSP 中非常重要的一部分,可以用于扩展 JSP 功能以及将页面分离成多个组件实现模块化开发。 在 JSP 中,循环遍历是非常常见的需求,使用自定义标签实现循环遍历可以增加…

    Java 2023年6月15日
    00
  • Spring-MVC异步请求之Servlet异步处理

    下面是对“Spring-MVC异步请求之Servlet异步处理”的完整攻略。 一、背景介绍 Spring框架提供了一种使得应用程序支持异步处理请求的方式,能够帮助提高应用程序的性能、吞吐量等指标。其中,支持异步请求的方式包括两种:Callable和DeferredResult,它们都是基于Servlet的异步原语API实现的。本篇攻略将主要介绍Servlet…

    Java 2023年5月16日
    00
  • Spring MVC的国际化实现代码

    Spring MVC的国际化实现代码攻略 在Spring MVC中,我们可以使用国际化来实现多语言支持。本文将详细讲解Spring MVC的国际化实现代码,包括如何配置国际化资源文件、如何使用MessageSource对象获取国际化信息等。 配置国际化资源文件 在Spring MVC中,我们可以使用.properties文件来存储国际化信息。下面是一个示例代…

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