cocoa: 異常和錯誤處理


本篇對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,還有很多不明白的地方,非常希望可以得到大家的指點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM