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)),所以就会执行相应的错误处理。


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利