异常处理

异常处理

作者:千里马的驴

日期:2020.4.15

基础知识

异常是程序在执行期间产生的问题。C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作。

异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:try、catch、throw

  • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
  • try: try 块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

如果有一个块抛出一个异常,捕获异常的方法会使用 trycatch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码

try
{
   // 保护代码
}catch( ExceptionName e1 )
{
   // catch 块
}catch( ExceptionName e2 )
{
   // catch 块
}catch( ExceptionName eN )
{
   // catch 块
}c

如果 try 块在不同的情境下会抛出不同的异常,这个时候可以尝试罗列多个 catch 语句,用于捕获不同类型的异常。

Demo

//抛出异常
int division(int a, int b)
{
	if(b == 0){
		throw "division is zero!";
	}
	return (a/b);
}

//捕获异常
int main()
{
	int ret;
	try{
		ret = division(2, 0);
		printf("ret = %d\n", ret);
	}
	catch(const char *msg)
	{
		printf("msg = %s\n", msg);
	}
    return 0;
}

结果:msg = division is zero!

如何定义新的异常

可以通过继承和重载 exception 类来定义新的异常。

Demo(注意对比上一个Demo)

//定义一个自己实现的异常
class IException :public std::exception
{
public:
	const char *what()
	{
		return "this is my exception";
	}
};

//抛出异常
int division(int a, int b)
{
	if(b == 0){
		throw IException();
	}
	return (a/b);
}

//捕获异常
int main()
{
	int ret;
	try{
		ret = division(2, 0);
		printf("ret = %d\n", ret);
	}
	catch(IException& e)
	{
		printf("an error occur: %s\n", e.what());
	}
	catch(const char *msg)
	{
		printf("msg = %s\n", msg);
	}
    return 0;
}

结果:an error occur: this is my exception

异常应用的场景

一般来说当出现一个无法处理行为,这些行为超出了函数正常功能的范围。典型的异常包括失去数据库连接以及遇到意外输入等。当程序的某部分检测到一个它无法处理的问题时,需要用到异常处理。

注意:如果抛出异常之后不做处理,那么一般会出现段错误,也就是通过看到的程序奔溃

还是使用上面那个例子,如果我们将主函数改成

int main()
{
	int ret;
	try{
		ret = division(2, 0);
		printf("ret = %d\n", ret);
	}
	//注释掉这个段后,抛出的异常无法被处理,程序奔溃
	/*
	catch(IException& e)
	{
		printf("an error occur: %s\n", e.what());
	}
	*/
	catch(const char *msg)
	{
		printf("msg = %s\n", msg);
	}
    return 0;
}

结果:段错误,程序奔溃

terminate called after throwing an instance of 'IException'
  what():  std::exception
Aborted (core dumped)

参考

C++/C++11中std::exception的使用

C++异常处理

posted @ 2020-04-15 15:20  千里马的驴  阅读(157)  评论(0编辑  收藏  举报