【技术篇】C++中异常处理

本文介绍了C++中的异常处理,包括异常处理的目的和使用方法。异常处理是保证程序稳定性和健壮性的机制,通过try、throw、catch关键字实现。异常处理能控制非法操作并防止程序崩溃,try块包含可能抛出异常的代码,catch块捕获并处理异常。文章详细阐述了不同类型的异常处理方式,强调了catch块的匹配策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)异常处理的简介

     异常处理是编程语言或者计算机硬件里面的一种机制,用于处理软件或者信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件);在软件开发中,异常处理机制是一种比较有效的处理系统运行时的错误方法。C++针对异常处理提供了一种标准的方法,用于处理程序运行是的错误,保证软件系统运行的稳定性与健壮性。但是异常处理没有普通方法函数调用速度快。过度的错误处理回影响应用程序的运行效率。

(二)异常处理的目的

     通过异常处理,我们可以针对用户在程序中的非法操作进行控制和提示,防止程序崩溃;

(三)异常处理的使用方法

   3.1异常处理1

      C++中的异常处理主要使用了三个关键字:try、throw、catch;通常我们会先使用try块包含可能出现的异常代码,然后用两个辅助的操作来完成异常处理,两个辅助操作如下:

         (1)满足某个条件时用throw关键字抛出异常;

         (2)使用catch块来匹配抛出的异常后将其处理;

     其中 try块用来包含可能会出现异常的语句;catch块用来捕捉和处理可能出现异常的语句中throw抛出的异常,并且能够和throw抛出的异常类型能够匹配;try—catch的语法如下:

try
{
    包含可能抛出异常的语句
}
catch(类型名(参数名))//捕捉特定类型的异常
{
    处理异常的语句
}

示例:

int fun(int a, int b)
{
    if (b == 0)
	   throw "error!"; //在满足条件“b == 0”时,使用关键字“throw”抛出异常
    return a / b;
}

int main()
{
    try //try块中放着可能会出现异常的代码
    {
	   fun(1, 0);
    }
    catch (const char* error) //catch用来捕捉放入try块的代码中抛出的char*类异常
    {
    	cout << error << endl; //匹配到异常的处理代码
    }
    return 0;
}

 

3.2 异常处理2

在满足特定条件,throw抛出异常后,下面的语句将不会执行;

int fun2(int a, int b)
{
    if (b == 0)
	throw "find a error!"; //在满足条件“b == 0”时,使用关键字“throw”抛出异常
    cout << "work is going on !" << endl;
    return a / b;
}

int main()
{
    try //try块中放着可能会出现异常的代码
    {
	fun2(1, 0);
    }
    catch (const char* error) //catch用来捕捉放入try块的代码中抛出的char*类异常
    {
	cout << error << endl; //匹配到异常的处理代码
    }
    return 0;
}

   3.3抛出异常3

     抛出异常是由程序员决定什么是异常,以及是否要抛出异常,抛出什么类型的异常;

    (1)当我们认为被除数为1为异常,并将之抛出

int fun(int a, int b)
{
if (b == 1)
	throw "find a error!"; 
return a / b;
}

int main()
{
    try 
    {
	fun(3, 1);
    }
    catch (const char* error) 
    {
	cout << error << endl;
    }
    return 0;
}

 

(2)在任何情况下都不抛出异常

int fun(int a, int b) //fun函数不抛出异常
{
    return a / b;
}

int main()
{
    try  //及时将fun代码块放入try块中,没有异常抛出,catch就捕获不到异常
    {
	fun(3, 1);
    }
    catch (const char* error) 
    {
	cout << error << endl;
    }
    cout << fun(3,1) << endl;
    return 0;
}

(3)抛出的异常类型

int fun1(int a, int b)
{
    if (b == 1)
	throw "find a error!";  //抛出char* 类型的异常
    return a / b;
}

int fun2(int a, int b)
{
    if (b == 1)
	throw -1;  //抛出int类型的异常
    return a / b;
}
int main()
{
    try 
    {
	fun1(3, 1);
    }
    catch (const char* error)  //捕捉char* 类型的异常
    {
	cout << error << endl;
    }

    try 
    {
	fun2(3, 1);
    }
    catch (int error)  //捕捉int类型的异常
    {
	cout << error << endl;
    }


    return 0;
}

【注:catch可以有自己匹配类型的功能,如下图所示:】

int fun(int a, int b)
{
    if (b == 1)
	//throw "find a error!";  //抛出char* 类型的异常;结果如图一所示
	throw - 1; //抛出int类型的异常;结果如图二所示
    return a / b;
}

int main()
{
    try
    {
	fun(3, 1);	
    }
    catch (const char* error)  //捕捉char* 类型的异常
    {
	cout << error << endl;
    }
    catch (int error)  //捕捉int类型的异常
    {
	cout << error << endl;
    }
    return 0;
}

结果1

结果2

3.4抛出异常4

有一种可以捕捉到任何类型异常的块,这种catch块是一种“保底办法”,防止因为有一些异常没有匹配的catch块而导致异常中止;语句如下所示:

try
{
    语句块
}
catch(...)
{
    语句块
}

【注:我们一般将匹配度高的catch块放在最前面,没有参数类型的catch块是通用性最强,针对性最差的,应该将其放在所有catch语句的最后,就像switc--case语句中的default一样】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值