Passing Exceptions Up the Call Stack(将异常
视频锁定
{$ currentTime | date:'mm:ss' $}
{$ timeLeft | date:'mm:ss' $}
如果-readDataFile:方法的调用者,将调用-readDataFile:方法的代码也放在了NS_DURING … NS_HANDLER … NS_ENDHANDLER代码块中,那么它就可以捕获到上述代码中第三种情况抛出的异常,并同样用我们看到方法去处理。因为站在更高一个层级上,所以肯定比在-readDataFile:方法中,有更合适的解决办法。
如果,换一种情况,-readDataFile:的调用者并没有将调用代码放在NS_DURING … NS_HANDLER … NS_ENDHANDLER代码块中,那么它就没机会捕获到这个异常了。但是这个异常会继续在调用栈中找到调用这段代码的调用者,看看它可不可以捕获这个异常,直到最定级的代码块,如果都没有找到NS_DURING … NS_HANDLER … NS_ENDHANDLER的话,一个系统方法NSUncaughtExceptionHandler将被调用。这个函数将向控制台(console)中打印这个错误消息,并立即退出这个程序。如果你不想让这件事发生,你可以通过调用 NSSetUncaughtExceptionHandler(fn_ptr)这个函数去重写 NSUncaughtExceptionHandler这个方法。 这里的fn_ptr是使用如下签名的函数的名字
void NSUncaughtExceptionHandler(NSException *exception);
重写方法的一种可能的目的是当程序运行出错引起一个异常后,在程序退出前,将程序运行中一些未保存的状态存入文件中。
在线练习
{$ activeFileHint $}