2012-10-25 52 views
2

我不知道這是否是正確與否:NSError:傳遞錯誤的方法

- (void)parseSomething:(id)targetObject error:(NSError **)error { 
    NSError *parserError = nil; 
    [myParser parse:targetObject error:&parserError]; 

    if (parserError != nil) { 
     *error = parserError; 
    } 
} 

行:

*error = parserError; 

我設置錯誤的參數是本地的錯誤,是它做對了嗎?

,或者我應該做的事:

error = &parserError; 

呢?

回答

4

您需要確保error在嘗試對其進行解引用之前不是零。另外,不需要本地的NSError。它會這樣編寫代碼:

- (void)parseSomething:(id)targetObject error:(NSError **)error { 
    [myParser parse:targetObject error:error]; 
} 

但是,如果您確實需要locale變量(或用於演示目的)。那麼這個:

- (void)parseSomething:(id)targetObject error:(NSError **)error { 
    NSError *parserError = nil; 
    [myParser parse:targetObject error:&parserError]; 
    if (error && parserError) { 
     *error = parserError; 
    } 
} 

同樣,有一個這樣的NSError out參數的大多數方法通常有一個BOOL返回值或一些其他的返回值來表示成功與否。您不應該依賴錯誤參數來指示是否存在錯誤。

- (BOOL)parseSomething:(id)targetObject error:(NSError **)error { 
    NSError *parserError = nil; 
    BOOL ok = [myParser parse:targetObject error:&parserError]; 
    if (error && parserError) { 
     *error = parserError; 
    } 

    return ok; 
} 
0

在這種情況下,您可能希望進一步傳遞錯誤,而不需要中間變量。但是,您需要確保myParser對象正確處理錯誤參數。

- (void)parseSomething:(id)targetObject error:(NSError **)error 
{ 
    [myParser parse:targetObject error:error]; 
} 

在你想在這裏處理它時,你需要確保指針的指針error點東西,否則提領時,你將有崩潰。

例如:該方法被稱爲像這樣

[object parseSomething:targetObject error:NULL]; 

下面一行導致崩潰:

*error = parserError; 

正確的代碼應該是這樣的:

- (void)parseSomething:(id)targetObject error:(NSError**)error 
{ 
    NSError* parserError = nil; 
    [myParser parse:targetObject error:&parserError]; 
    if (error != nil) 
    { 
     *error = parserError; 
    } 
} 

不是問題parserError爲零時,但當error爲零時。