2013-08-06 33 views
2

我使用的是全部基於塊的mailcore2。他們通常定義,像這樣如何解決NSException格式使用非字符串文字的安全問題

SomeMailCoreOp *op = [session getOp]; 
[op start:^(NSError* error, id result) { 
    if (error) { 
     // handle error code    
    }  
}]; 

所以我想要做的基本上是簡單地拋出一個NSException每次遇到一個錯誤的時間..所以我可以在我的代碼庫別的地方抓住它的操作。所以我創造了NSError類別:

@implementation NSError (Addons) 

-(NSString *)description { 
    return [NSString stringWithFormat:@"%@ - %@", 
      [self localizedDescription], [self localizedFailureReason]];   
} 
@end 

,這是我想一般處理錯誤:

SomeMailCoreOp *op = [session getOp]; 
[op start:^(NSError* error, id result) { 
    if (error) { 
     [NSException raise:@"failure" format:[error description]];    
    }  
}]; 

我想這是有道理的由於在documentation爲NSException他們得到了這對於format

格式,人類可讀的消息字符串(即,異常 原因)與轉換規格爲可變參數的是 後續。

format string is not a string literal (potentially insecure) 

我怎麼解決這個問題:

但我當我做上述總能得到這個編譯器警告?

回答

4

format是格式字符串,如NSLog()[NSString stringWithFormat:]。在你的情況下,

[NSException raise:@"failure" format:@"%@", [error description]]; 

不會產生警告。有關更多信息,請參閱Apple Docs for formatting string objects

欲瞭解更多信息,爲什麼有非文本字符串作爲格式是不安全的,見Uncontrolled format string維基百科

注意,蘋果不鼓勵使用異常流量控制的:

Cocoa Core Competencies

雖然在許多編程環境中常用異常來控制編程流程或表示錯誤,但不要在Cocoa和Cocoa Touch應用程序中以這種方式使用異常。相反,您應該使用方法或函數的返回值來指示發生錯誤,並在錯誤對象中提供有關問題的信息。

Dealing with Error

如果你從其他平臺和語言來了,你可以用來與廣大的錯誤處理異常的工作。在使用Objective-C編寫代碼時,異常僅用於程序員錯誤,如超出界限的數組訪問或無效的方法參數。這些是您在發佈應用程序之前應該在測試期間找到並解決的問題。