本篇對cocoa項目中,錯誤和異常處理做一些總結。也歡迎大家批評交流。
對於異常我們經常使用try-catch:
@try { //有可能錯誤的代碼 @throw expression } @catch (NSException *exception) { //捕獲異常 } @finally { //最終處理 }
這種形式經常用於開發模式下debug,但是從實際操作來看,用的不多(或者說不知道怎么用)。
我們將錯誤和異常做了區分:
錯誤就是需要用戶知道的,用戶需要即使作出反應或者只需要知道的
異常就是會引起程序奔潰或者不能正常運行,或者即使能正常運行但需要及時修正的
反映到程序上,錯誤會需要和用戶交互,但異常需要盡量的避免。
在實際中,我們這樣處理:
1. 發生的錯誤,需要用戶反應才能繼續操作的,使用NSAlert:
[NSAlert alertWithMessageText:<#(NSString *)#> defaultButton:<#(NSString *)#> alternateButton:<#(NSString *)#> otherButton:<#(NSString *)#> informativeTextWithFormat:<#(NSString *), ...#>]
2. 發生錯誤,不影響程序運行,用戶也不需要馬上反應。可以使用NSAlert,或者:
[view/window presentError:<#(NSError *)#> modalForWindow:<#(NSWindow *)#> delegate:<#(id)#> didPresentSelector:<#(SEL)#> contextInfo:<#(void *)#>]
這個方法定義在NSResponder中,view/window都可以調用。這種方法還會根據error的響應鏈逐級傳遞。
3.發生了異常,但不至於使程序奔潰等。比如數組越界之類的錯誤,在Cocoa上並不會使程序奔潰。這里推薦使用cocoa的exception庫。
//要記得添加framework,再import #import <ExceptionHandling/ExceptionHandling.h> //在controller類: [[NSExceptionHandler defaultExceptionHandler] setExceptionHandlingMask:0x01ff];//mask可根據需要設置 [[NSExceptionHandler defaultExceptionHandler] setDelegate:self]; //實現delegate: - (BOOL)exceptionHandler:(NSExceptionHandler *)sender shouldLogException:(NSException*)exception mask:(unsigned int)mask { NSLog(@"%s:\n%@",__PRETTY_FUNCTION__, exception); // our handling return YES; }
這種方法可以捕獲任何異常,適於在debug下調試。
以上就是我們項目中異常和錯誤處理的經驗總結。
初次開發cocoa,還有很多不明白的地方,非常希望可以得到大家的指點。