【问题标题】:Checking NSError description against expected string fails根据预期字符串检查 NSError 描述失败
【发布时间】:2014-01-13 00:47:53
【问题描述】:

我的程序检查 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 语句中输入的内容完全相同。

【问题讨论】:

  • 您确定描述中没有隐形字符吗?要检查,打印分隔符之间的描述:NSLog(@"|%@|", errorDescription);
  • 请发布 NSLog 输出。
  • 另外,这不是正确的 Cocoa 错误处理。约定要求您在使用NSError 之前检查直接返回值,而不是检查错误是否为nil。通过快速阅读,我相信 NMSSH 正确地遵循了约定。除非execute:error: 的返回值为nil,否则您不应触及该错误。不过,这不太可能是您的问题的一部分。
  • @JoshCaswell,感谢第一个提示,我意识到有一个换行符。事情现在输出正常。另外,我更改了第一个条件以反映“约定”。原来即使有错误,响应也不是nil,只是一个空字符串。
  • 根据硬编码的英文字符串检查错误的本地化描述对于非英文用户可能会失败。

标签: ios objective-c cocoa-touch nsstring nserror


【解决方案1】:

除非你认真认为iOS的If语句结构坏了,或者isEqualToString方法的实现坏了,那么字符串是一样的,没有什么神秘的:

您输入的内容要么使用了不同的字符(请参阅:unicode 和字符编码类型),要么在您的日志输出中有不可见/非打印字符,因为您看不到它们而没有输入它们。

我建议遍历字符串中的字符并打印出字节码值:

for (i=0 to length of string) : print [errorDescription characterAtIndex:i];

你会发现你输入的字符串的字节码序列等于localizedDescription方法返回的字节码序列。

正如其他人所说,将程序逻辑基于您无法控制的确切字符串并且可以在不通知的情况下更改,这在这里可能不是最佳解决方案。错误码呢?

【讨论】:

  • 不幸的是,我使用的 API 没有使用错误代码。
  • 我强烈建议您请求 API 的作者切换到使用错误代码。 localizedDescription 的“本地化”位是有原因的
【解决方案2】:

我建议使用错误代码,因为您正在使用一个您无法控制的库,通常公开的界面应该告诉您与每种预期错误相关的错误代码是什么。使用错误代码将使您的代码更强大、更清晰且独立于字符串。

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

【讨论】:

    猜你喜欢
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多