c++ primer plus 第15章友,异常和其他 15.3.11 有关异常的注意事项

c++ primer plus 第15章友,异常和其他 15.3.11 有关异常的注意事项

15.3.11 有关异常的注意事项


15.3.11 有关异常的注意事项

从前面关于如何使用异常的讨论可知,应在设计程序时就加入异常处理功能,而不是以后再添加。这样做有些缺点。例如,使用异常会增加程序代码,降低程序的运行速度。异常规范不适用于模板,因为模板函数引发的异常可能随特定的具体化而异。异常和动态内存分配并非总能协同工作。下面进一步讨论动态内存分配和异常。首先,请看下面的函数:

void testl(int n)
{
string mesg("I'm trapped in an endless loop");i
if (oh_no)
	throw exception();
	...
return;
}

string 类采用动态内存分配。通常,当函数结束时,将为mesg 调用string 的析构函数。虽然 throw语句过早地终止了函数,但它仍然使得析构函数被调用,这要归功于栈解退。因此在这里,内存被正确地管理。
接下来看下面这个函数:

void test2(int n)
{
double*ar = new double[n];
 ...
if (oh_no)
throw exception);
...
delete [] ar;
return;
}

这里有个问题。解退栈时,将删除栈中的变量ar。但函数过早的终止意味着函数末尾的 delete[]语句被忽略。指针消失了,但它指向的内存块未被释放,并且不可访问。总之,这些内存被泄漏了。这种泄漏是可以避免的。例如,可以在引发异常的函数中捕获该异常,在catch块中包含一些清理代码,然后重新引发异常:

void test3(int n)
{
double*ar=new double[n];
try{
if(oh_no)
throw exception()
}
catch(exception & ex)
{
	delete [] arr;
	throw;
}
... delete []arr;
return ;
}

然而,这将增加疏忽和产生其他错误的机会。另一种解决方法是使用第16章将讨论的智能指针模板
总之,虽然异常处理对于某些项目极为重要,但它也会增加编程的工作量、增大程序、降低程序的速度。另一方面,不进行错误检查的代价可能非常高。
异常处理

在现代库中,异常处理的复杂程度可能再创新高--主要原因在于文档没有对异常处理例程进行解释或解释得很整脚。任何熟练使用现代操作系统的人都遇到过未处理的异常导致的错误和问题。这些错误背后的程序员通常面临一场艰难的战役,需要不断了解库的复杂性:什么异常将被引发,它们发生的原因和时间,如何处理它们,等等。 程序员新手很快将发现,理解库中异常处理像学习语言本身一样困难,现代库中包含的例程和模式可能像 C++语法细节一样陌生而困难。要开发出优秀的软件,必须花时间了解库和类中的复杂内容,就像必须花时间学习 C++本身一样。通过库文档和源代码了解到的异常和错误处理细节将使程序员和他的软件受益。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值