C++ 异常处理(笔记)

                     

贡献者: addis

  • 本文处于草稿阶段。

   在初学编程时,遇到错误我们往往就直接用 exit() 终止程序。但有时候我们不希望程序终止,而是希望程序自行对错误进行一定的处理。C 语言的常见办法是把函数的返回值(通常是整型)作为错误代码,0 代表成功,其他值对应不同类型的错误。然而函数调用是重重嵌套的,将错误代码层层传递是一件很麻烦的事情,另外,把错误处理和函数调用的语法分离开也可以使代码的结构更明显。当然 C 还有另外一种办法就是通过一个全局变量(通常叫做 errno)来传递错误信息,但它只能是一个整数类型,如果你自定义许多其他的全局变量来传递错误信息,常常会导致混乱(使用全局变量一般是不太好的习惯,会导致代码非常难以调试)。

   在 C++ 中有专门的异常处理机制,一般使用 throw(抛出某种类型的错误), try(检测某段代码的运行)和 catch(处理某种类型的错误)三个关键词完成。来看一个简单的例子。

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

struct err_info { string where, what;};

void fun2()
{
	err_info e;
	e.where = "fun2()"; e.what = "something wrong!";
	throw e;
}

void fun1() { fun2(); }

int main () {
	try { fun1(); }
	catch (err_info e) {
		cout << "where: " << e.where << endl;
		cout << "what: " << e.what << endl; 
	}
}
程序中 main() 调用 fun1()fun1() 接着调用 fun2(),而 fun2() 必然会出现一个异常,抛出了一个类型为 err_info 的对象 e。这时无论 fun2() 是否运行完成都会终止,并把 e 传给 fun1(),而 fun1() 并没有处理这个异常的代码,所以 fun1() 同样也终止运行,并把 e 回传给 main()。由于 main() 中存在处理 err_info 类型错误的代码(catch (err_info e)),所以就会执行相应的错误处理。

                     

© 小时科技 保留一切权利