Iphone 如何解决NSException格式使用非字符串文字的安全问题

Iphone 如何解决NSException格式使用非字符串文字的安全问题,iphone,objective-c,error-handling,compiler-errors,nserror,Iphone,Objective C,Error Handling,Compiler Errors,Nserror,我用的都是基于块的。通常,它们定义这样的操作 SomeMailCoreOp *op = [session getOp]; [op start:^(NSError* error, id result) { if (error) { // handle error code } }]; 所以我想做的基本上就是每次遇到错误时抛出一个NSException。。这样我就可以在我的代码库中的其他地方捕获它。。因此,我为NSError创建了一个

我用的都是基于块的。通常,它们定义这样的操作

SomeMailCoreOp *op = [session getOp];
[op start:^(NSError* error, id result) {
    if (error) {
        // handle error code            
    }    
}];
所以我想做的基本上就是每次遇到错误时抛出一个NSException。。这样我就可以在我的代码库中的其他地方捕获它。。因此,我为NSError创建了一个类别:

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

SomeMailCoreOp *op = [session getOp];
[op start:^(NSError* error, id result) {
    if (error) {
        [NSException raise:@"failure" format:[error description]];            
    }    
}];
我认为这是有道理的,因为在for NSException中,他们得到了以下格式:

格式,一个人类可读的消息字符串,即异常 使用以下变量参数的转换规范进行推理: 跟着

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

format string is not a string literal (potentially insecure)
如何解决此问题?

格式是一个格式字符串,如NSLog或[NSString stringWithFormat:]中的格式字符串。就你而言

[NSException raise:@"failure" format:@"%@", [error description]];
不会产生警告。有关更多信息,请查看

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

请注意,Apple不鼓励将异常用于流控制:

发件人:

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

发件人:

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

format是一个格式字符串,如NSLog或[NSString stringWithFormat:]中的格式字符串。就你而言

[NSException raise:@"failure" format:@"%@", [error description]];
不会产生警告。有关更多信息,请查看

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

请注意,Apple不鼓励将异常用于流控制:

发件人:

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

发件人:

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