2012-02-18 45 views
1

我想測試不返回任何東西的方法。該方法通過聲稱一個參數不包含非法值開始:漁獲ObjC失敗NSParameterAssert而不退出

- (void) someMethod:(NSString*)param { 
    NSParamaterAssert(param != @"0"); 
    // more code 
} 

在我的測試代碼中,我想,以確保非法值被抓住了,但我不希望在測試過程中退出程序。在python中,我可以嘗試:除了:抓住它。目標C中是否有等價物?我在這裏錯誤地使用了斷言嗎?

回答

2

你混合了 「例外」 和他們的 「處理」 與斷言。 (發現斷言here更多信息,「異常處理」,也就是在維基百科上,但unfortunetaly我只允許發佈2個鏈接)。

斷言通常不被用作一種(通常很嚴重的)錯誤,保護你的方法/程序(如在特殊情況下錯誤的函數的行爲)。 斷言例如用於程序的驗證。

你想處理異常(像你的情況不對參數)。 這樣做的好起點是here(僅限ObjC)。

+0

謝謝,NSException和「@try @catch @finally」的結合很好地完成了這項工作。 –

0

在Objective-C中,NSAssertion用於仔細檢查代碼中的假設 - 斷言只會失敗,因爲您在代碼中犯了錯誤,而不是因爲無效參數或意外情況。

NSException被用於諸如無效的參數等,因此是你在說什麼更適合(但測試它的外面是沒有標準的做法,@catch一個NSException並繼續執行:你會,而不是僅僅做終止前的一些錯誤報告)。

下面是你在你的情況下使用NSException。首先,如下改變someMethod:

- (void) someMethod:(NSString*)param { 
    if (param == @"0") { 
     [NSException raise:@"Invalid param value" format:@"param of 0 is invalid"]; 
    } 
    // more code 
} 

然後當你調用someMethod:

@try { 
    [yourObject someMethod:@"0"]; 
} 
@catch (NSException *exception) { 
    NSLog(@"main: Caught %@: %@", [exception name], [exception reason]); 
} 
@finally { 
    //any code that should be executed whether or not the exception is raised 
} 

基於您的評論,我想你會想設置一些種類標誌在@catch塊,如果該標誌沒有被設置(即,沒有拋出異常),然後終止。

P.S.只是你知道,對於在正常程序執行期間想要反應錯誤的情況(與測試相反),NSError更具慣用性。

+0

我很高興看到如何使用NSError的示例,但@Jurlie是正確的,我不想向該方法添加參數 - 我只是想在外部驗證它的工作情況而不對其進行重新編碼。我認爲NSException可能更合適。 –

+0

也許我沒有在我的問題中說清楚,但如果方法傳遞格式錯誤的參數,我希望程序退出。然後我希望測試代碼檢查參數檢查,並且只有在允許格式錯誤的參數通過時退出。 –

+0

我的不好,誤解了你的問題。查看更新的答案。 – yuji