2014-01-13 29 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

我会建议使用错误代码,因为您使用的是无法控制的库,通常暴露的接口应告诉您与每种预期错误关联的错误代码是什么。使用错误代码会使你的代码更强大,清晰和独立于字符串。

无论如何,如果您宁愿继续比较字符串值,因为您有充足的理由这么做,我会建议您注意可能的标点符号,格式化字符(例如换行符或小写/大写字母)。