2014-01-13 59 views
0

我的程序檢查如果有一個NSError對象存在,並將其發送給另一個方法,像這樣:檢查與預期字符串NSError描述失敗

if([response isEqualToString:@""]) { 
     [self handleError:commandError]; 
    } 

handleError:,我嘗試檢查,對預期的字符串,如本地化說明這個:

-(void)handleError:(NSError*)error 
{ 
    NSString* errorDescription = [error localizedDescription]; 
    NSLog(@"%@",errorDescription); //works fine 
    if([errorDescription isEqualToString:@"sudo: no tty present and no askpass program specified"]) { 
     NSLog(@"SO Warning: Attempted to execute sudo command"); 
    } 

} 

但是,if語句沒有被觸發。日誌輸出與我在if語句中輸入的內容完全相同。

+3

您確定描述中沒有隱形字符嗎?要檢查,在分隔符之間打印描述:'NSLog(@「|%@ |」,errorDescription);' –

+3

請發佈NSLog輸出。 – danh

+3

此外,這是不正確的可可錯誤處理。該慣例要求您在使用'NSError'之前檢查直接返回值,而不是錯誤是否爲'nil'。從快速瀏覽中,我相信NMSSH會遵循這個慣例。除非'execute:error:'的返回值爲'nil',否則不應觸及錯誤。不過,這可能不是你問題的一部分。 –

回答

0

除非你認真思考的iOS的if語句結構被打破,或isEqualToString方法實現被打破,那麼字符串相同,也沒有什麼神祕:

你打出來是什麼要麼使用不同的字符(請參閱:unicode和字符編碼類型),要麼在日誌輸出中有不可見/非打印的字符,因爲您看不到它們。

我建議通過在字符串中的字符循環和打印出字節碼值:

對於(i = 0到串的長度):打印[ERRORDESCRIPTION characterAtIndex:ⅰ];

你會發現你鍵入的字符串的字節碼序列是而不是等於localizedDescription方法返回的字節碼序列。

正如其他人所說的那樣,將程序邏輯建立在不受控制的精確字符串上,並且可以在沒有通知的情況下進行更改,這可能不是最佳解決方案。什麼是錯誤代碼?

+1

我正在使用的API不使用錯誤代碼,很不幸。 – Carpetfizz

+0

我強烈建議您請求API的作者切換到使用錯誤代碼。 「localizedDescription」的「本地化」位是有原因的 –

0

我會建議使用錯誤代碼,因爲您使用的是無法控制的庫,通常暴露的接口應告訴您與每種預期錯誤關聯的錯誤代碼是什麼。使用錯誤代碼會使你的代碼更強大,清晰和獨立於字符串。

無論如何,如果您寧願繼續比較字符串值,因爲您有充足的理由這麼做,我會建議您注意可能的標點符號,格式化字符(例如換行符或小寫/大寫字母)。