C++中的异常处理(一)

来源:互联网 发布:问道有mac版吗 编辑:程序博客网 时间:2024/06/08 09:52

时间:2014.03.15

地点:基地

—————————————————————————

一、简述

  异常处理是很多高级语言都有的机制,旨在在程序运行时捕获这些不正常的但能预料的情况,并根据异常类型做相应的处理。比如文件打开失败或者网络断开。我所接触的C#和Python和Java中均有异常处理机制,任何好处的获得都是要付出代价的,没有免费的午餐,即便是早晨和晚餐也如此。我们在程序中加入异常机制来处理错误,必然也是如此,异常的使得代码膨胀不说,还大大降低了程序性能,因此要合理使用。

—————————————————————————

二、浅谈异常

  程序不是孤立的,他们会与外界打交道,比如网络,文件,串口等。所有的这些都可能发生错误,完善的程序是应该在碰到这些错误时程序有即时的响应机制。就像建筑,虽然平时不发生火灾,地震,我们也不期待发生这些事故,但建楼时我们必须予以考虑,配备消防系统和防震结构。而诸如像C这样的编程语言没有提供异常处理机制,则也必须依赖于其他方法比如函数返回值等进行相应的错误处理。

—————————————————————————

三、深谈异常处理机制

  异常机制:一段代码提醒另一段代码,在发生异常的情况下,所采用的代码执行路径和正常的代码执行路径是不相同的。遇到错误的代码段会抛出异常,而处理异常的代码段会捕获异常。当某段代码抛出异常时程序立即停止执行当前语句,转向异常处理代码。异常处理程序可置于任何地方,同一函数下也可,函数调用堆栈中相隔好几个函数也OK。我看到过一个很形象的比喻,说将可能抛出异常的代码当做棒球的外场手,当他把球(即异常)抛回内场时,离球最近的内场手(最近的异常处理程序)会捕获到这个球。在函数调用堆栈中,假如FunctionA能够处理异常,而在FunctionA中调用的FunctionB,在FunctionB中又调用了FunctionC,FunctionC在执行过程中抛出异常,那么离处理异常最近的函数是FunctionA,但在整个过程中,为函数调用建立的堆栈帧也会层层销毁,在这里最好只留下FunctionA在堆栈中。

—————————————————————————

四、使用异常处理的优点

  异常提供了方便、一致并且安全的错误处理机制。在传统的方法中,有这些缺陷:1,将返回代码作为报告错误的机制时,调用者可能忽略返回的代码,或者只在局部进行了错误处理而并没有将错误代码向上提交。2,像C中一样返回整数代码的形式通常不足以包含足够的信息。而异常处理机制可以将任何信息从发现错误的代码段传递到处理错误的代码段。更具诱惑的是异常处理可以跳过堆栈的层次,就像上面的举例一样,FunctionA可以处理沿着堆栈进行数次函数调用后发生的错误,而中间函数不需要有任何错误处理程序。而传统的返回代码的形式显然是要求各层调用都显示执行清理。

—————————————————————————

五、异常处理的缺点

  看过几本书和帖子,有说异常处理机制开销很大,使得代码膨胀,性能大打折扣,不知真假,也有说异常处理的开销并不大,可以忽略。但开销有是肯定的,在无需异常的地方不耍牛逼硬是强加即可。异常处理机制的优点肯定是大于缺点,因为现代化的大楼建设消防系统和防震措施的完备是应该的,即使会产生成本,你说呢。

0 0
原创粉丝点击