1.目的
异常处理提供了一种将控制权从正在执行的程序中的给定点转移到与先前执行的另一点关联的异常处理程序的方法。在各种错误条件下引发异常,该异常会中断其正常执行并将控制权传递给捕获此异常的处理程序,以保护软件质量。OCC作为开源的几何算法库,它里面有一套完整的异常管理机制,通过观察其异常机制实现原理,发现其优缺点,为在其他CAD软件系统的错误处理方面提供帮助。
2.异常处理机制
OCC实现了异常类的层次结构。根类为Standard_Failure,其它异常类直接或间接继承该根类。Standard_Failure类只有一个属性myMessage,它用来记录异常信息,其子异常类可以在其基础上扩展。
在应用程序的正常执行期间,不应引发任何异常,可能引发异常的方法应受其他方法的保护,但又不能影响正常使用的效率,所以一般会在程序的调试版本中包含保护并在发布版本中排除保护。OCC为了支持这种做法为每个异常类提供了一个带_Raise_if()的宏函数,如下所示:
CONDITION是条件,导致引发异常的逻辑表达式,MESSAGE是错误消息。通过在编译时定义预处理符号之一No_Exception或No_ErrorTypeName可以删除整个调用。下图代码为其使用案例:
OCC使用C++ throw抛出异常,通过try…catch捕捉处理异常,如下图所示:
异常捕捉机制按出现顺序处理程序,从最接近try块到最远的处理程序,直到与catch里面的表达式匹配。对于try块,将基本异常类型的处理程序放在其派生类型的处理程序之前是错误的,因为这将确保永远不会调用派生异常的处理程序。OCC的异常形成一个与其他用户定义的类完全分离的层次结构树。Standard_Failure作为整个异常层次结构的根,因此,使用具有Standard_Failure类型的处理程序可以捕获任何OCC的异常,一般建议在主例程中设置此类处理程序。
OCC异常处理为了使用程序以其它异常相同的形式捕获系统信号(访问违规,除零等),需要通过OSD::SetSignal()方法在运行时安装适当的信号处理程序。通常在main()函数开头调用。它安装一个处理程序,将系统信号转换为OCC异常。为了支持在不同平台上实现这种处理,OCC定义了一个OCC_CATCH_SIGNALS的宏,实际使用中需要把该宏放置在try{}块的开头。OCC_CATCH_SIGNALS宏定义如下:
如上所示,在Windows下,默认情况该宏是一个空宏,所有情况下都使用普通C++异常,包括从信号处理程序抛出。在Linux下,默认情况下定义该宏,由于Linux不可能从系统信号处理函数抛出C++异常(应该是Linux信号是C形式的),因此该函数会跳到最近宏OCC_CATCH_SIGNALS调用,并且只有在那里才会实际抛出C++异常。
3.总结及建议
OCC | |
错误处理机制 | Try…catch异常机制 |
实现方式 | 以Standard_Failure为根类设计异常层次结构,并将系统信号转为异常统一处理 |
使用情况 | 比较统一,使用比较规范 |
效率影响 | 大量使用异常处理,影响效率 |
跨平台特性 | 多平台 |
错误信息 | 输出错误信息更全面 |
异常机制可以捕捉一些错误码无法处理的错误信息,但会影响效率。OCC主要通过这种异常机制来做错误处理,它定义了一套完整的异常结构层次,并把系统信号转为异常统一处理,形成自己的错误处理规范,为此便利了操作,但效率还有待提升。
君方智能设计平台介绍链接:ShipMaker船舶协同设计软件介绍-CSDN博客