分页:
[1] 2 3 4 5 6 7 8 9 10 下一页 后10页
大型应用软件往往是分层构建的。在最底层你会发现库函数,API函数,和私有的底层函数。然而在最高层则是用户接口组件,比如一个电子制表软件让用户填写数据表单。下面来看一种普通的航空订票系统:它的最高端是由一些GUI组件所组成,用来在用户的屏幕上显示内容。这些高端组件与那些封装了数据库API的数据存取对象相互作用。再往底层一些,那些数据库API与数据库引擎相交互,然而数据库引擎自己又会调用系统服务来处理底层的硬件资源,比如物理内存,文件系统和安全模型。一般情况下,及其严格的运行期错误会在这些底层代码中被检测出来,但是它们不能-----或者说不应该----试图自己处理这些错误。解决这些严格的运行期错误的责任应该由高端组件来承担。为了解决一个错误,高端组件必须得到错误发生的通知。本质上,错误处理包括错误检测和通知高端组件。这些组件依次处理错误并且试图从错误中恢复。
传统的错误处理方法
在早些时期,C++本身并没有处理运行期错误的能力。取而代之的是那些传统的C方法。这些方法可以被归为三类设计策略:
返回一个状态码来表明成功或失败
把错误码赋值给一个全局标记并且让其他的函数来检测
终止整个程序
上述的任何一个方法在面向对象环境下都有明显的缺点和限制。其中的一些根本就不可接受,尤其是在大型应用程序中。接下来的部分将会仔细检查一下这些方法,目的是发现他们与生俱来的限制和危险性。
返回一个错误码
在某种程度上这个方法是有用的,比如一个小型程序有着一致而且有限的错误码存在,并且严格的报告错误和检查一个函数返回值的策略被应用。然而,这种方法也有着显著的局限性;例如,错误类型和它们的列举值必须标准化。因为一个库的实现者可能选择返回值0来代表一个错误,然而另一个实现者却选择0来代表成功并且用那些非0值代表出现错误。通常,那些返回码会在一个公共头文件中以符号常量的形式存在,从而在整个软件的开发过程中或者在一个开发团队里达成一致。但是,这些码并不是标准的。
求助于全局标记
终止程序
终止程序在极限环境下或者在调试阶段是可以被接受的。然而,abort()和exit()却不应该在面向对象环境中使用,甚至即使在调试阶段,因为他们并没有意识到C++对象模型的存在。
分页:
[1] 2 3 4 5 6 7 8 9 10 下一页 后10页