15.8 异常处理

wxWidget创立的时间比起"异常"的概念引入C++要早的多,因此在其代码中已经花费了大量的力气来应付各种各样的异常,因此,可以说,整个 wxWidgets框架内部都没有使用C++的异常机制.当然,这并不意味着你不可以在你的代码中使用C++的异常机制,相反,你在你的代码中使用它是安全的,而且wxWidgets也会帮助你这样作.

要在你的程序中使用异常处理机制,最简单的方法就是根本忽略它的存在,既然wxWidgets不会抛出任何异常,你又何必去处理异常呢?除非你的代码自己抛出了一些异常.这是最简单的方法,但是有时候,对于处理各种可能遇到的错误来说,这种方法是不够的.

另外一个策略是你只用异常机制来处理那些非常致命的系统错误.这种情况下,你不寄希望于你的程序可以从这种致命错误中恢复,它所作的事情只是让你的程序以一种更绅士的方式结束.这种情况下,你只需要重载你的wxApp派生类的OnUnhandledException函数来执行资源清除工作,注意这时候所有和异常有关的信息已经被清除了.如果你需要这些信息,你需要在OnRun函数中针对调用基类函数的语句使用try/catch语句块. 这将使得你可以捕获在应用程序主循环中引发的异常.如果你还希望处理在应用程序初始化和退出时候引发的异常,你需要在你的OnInit和OnExit函数中使用try/catch语句.

最后,如果你希望在异常发生的时候,你的应用程序可以从异常中恢复并且继续运行,那么:如果你程序的异常主要集中在某个类(或其派生类)的事件处理函数中,你可以你可以在这个类的ProcessEvent函数中统一处理这些异常,如果这是不切实际的,你还可以考虑重载wxApp:: HandleEvent函数,它将允许你拦截并处理任何由事件处理函数引发的异常.

wxWidgets的异常处理机制默认是打开的,它取决于wxUSE_EXCEPTIONS标记被设置为1.但是如果它被设置为0,在 windows版本中,你需要修改include/wx/msw/setup.h将其更改为1,或者在别的平台上运行configure时增加-- enable-exceptions开关.而将其设置为0或者使用--disable-exceptions开关将会产生更为小巧和相对快速的 wxWidgets库.另外,在windows平台下,如果你使用的是Visual C++,你希望使用wxApp::OnFatalException函数来处理异常而不是引发一个GPF(一般保护性错误),你可以在你的setup.h 中将wxUSE_ON_FATAL_EXCEPTION设置为1.相反的,如果你宁愿将这种错误扔给你的调试器,将它设置成0.

wxWidgets自带一个使用异常的例子,位于samples/except目录中.