2

我正在使用基于块的mailcore2 。通常他们定义一个这样的操作

SomeMailCoreOp *op = [session getOp];
[op start:^(NSError* error, id result) {
    if (error) {
        // handle error code            
    }    
}];

所以我想做的基本上就是NSException每次遇到错误时抛出一个..这样我就可以在我的代码库的其他地方捕获它..所以我创建了一个类别NSError

@implementation NSError (Addons)

-(NSString *)description {
    return [NSString stringWithFormat:@"%@ - %@",
            [self localizedDescription], [self localizedFailureReason]];        
}
@end

这就是我通常希望处理错误的方式:

SomeMailCoreOp *op = [session getOp];
[op start:^(NSError* error, id result) {
    if (error) {
        [NSException raise:@"failure" format:[error description]];            
    }    
}];

我认为这是有道理的,因为在NSException的文档format中他们得到了这个:

格式,一个人类可读的消息字符串(即异常原因),其中包含后面的变量参数的转换规范。

但是,当我执行上述操作时,我总是会收到此编译器警告:

format string is not a string literal (potentially insecure)

我该如何解决这个问题?

4

1 回答 1

4

format是格式字符串,如 inNSLog()[NSString stringWithFormat:]. 在你的情况下

[NSException raise:@"failure" format:@"%@", [error description]];

不会产生警告。查看用于格式化字符串对象的 Apple Docs 以获取更多信息。

有关为什么将非文字字符串作为格式不安全的更多信息,请参阅Wikipedia 上的不受控制的格式字符串

请注意,Apple 不鼓励使用 Exceptions 进行流控制:

来自Cocoa 核心能力

尽管在许多编程环境中通常使用异常来控制编程流程或表示错误,但不要在 Cocoa 和 Cocoa Touch 应用程序中以这种方式使用异常。相反,您应该使用方法或函数的返回值来指示发生了错误,并在错误对象中提供有关问题的信息。

处理错误

如果您来自其他平台和语言,您可能习惯于使用异常处理大多数错误。当您使用 Objective-C 编写代码时,异常仅用于程序员错误,例如越界数组访问或无效的方法参数。这些是您在发布应用程序之前应该在测试期间发现并修复的问题。

于 2013-08-06T06:08:55.847 回答