Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 根据预期字符串检查N错误说明失败_Ios_Objective C_Cocoa Touch_Nsstring_Nserror - Fatal编程技术网

Ios 根据预期字符串检查N错误说明失败

Ios 根据预期字符串检查N错误说明失败,ios,objective-c,cocoa-touch,nsstring,nserror,Ios,Objective C,Cocoa Touch,Nsstring,Nserror,我的程序检查NSError对象是否存在,并将其发送到另一个方法,如下所示: if([response isEqualToString:@""]) { [self handleError:commandError]; } -(void)handleError:(NSError*)error { NSString* errorDescription = [error localizedDescription]; NSLog(@"%@",errorDes

我的程序检查NSError对象是否存在,并将其发送到另一个方法,如下所示:

   if([response isEqualToString:@""]) {
        [self handleError:commandError];
    }
-(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");
    }

}
在handleError:中,我尝试根据如下所示的预期字符串检查本地化描述:

   if([response isEqualToString:@""]) {
        [self handleError:commandError];
    }
-(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语句中输入的内容完全相同。

除非您认真地认为iOS的if语句结构被破坏,或者isEqualToString方法实现被破坏,否则字符串是不一样的,没有什么神秘之处:

您键入的内容要么是使用不同的字符请参见:unicode和字符编码类型,要么是日志输出中存在不可见/非打印字符,您没有键入这些字符,因为您看不到它们

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

对于i=0的字符串长度:打印[errorDescription characterAtIndex:i]

您会发现您键入的字符串的字节码序列与localizedDescription方法返回的字节码序列不相等


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

我建议使用错误代码,因为您使用的是一个无法控制的库,通常公开的接口应该告诉您与每种类型的预期错误相关联的错误代码是什么。使用错误代码将使您的代码更加强大、清晰且与字符串无关


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

您确定描述中没有不可见的字符吗?要进行检查,请打印分隔符之间的说明:NSLog@|%@|,errorDescription;请发布NSLog输出。此外,这不是正确的错误处理。该约定要求您在使用NSError之前检查直接返回值,而不是检查错误是否为零。通过快速阅读,我相信NMSSH正确地遵循了约定。除非execute:error:的返回值为nil,否则不应触摸错误。不过,这不太可能是你的问题的一部分。@JoshCaswell,谢谢你的第一个提示,我意识到有一条新线。现在情况很好。此外,我还修改了第一个条件以反映约定。结果表明,即使有错误,响应也不是零,这只是一个空字符串。对于非英语用户,对照硬编码的英语字符串检查错误的本地化描述可能会失败。不幸的是,我使用的API没有使用错误代码。我强烈建议您请求API的作者切换到使用错误代码。本地化描述的本地化部分是有原因的