4

借口我的愚蠢问题,我希望对特定异常 NSInvalidArgumentException 使用捕获,所以,我的 OSX 项目中有下一个代码:

@尝试

{

...

} @catch(NSInvalidArgumentException* 异常)

{

...

}

但是 xcode 说我:“未知类型名称 'NSInvalidArgumentException'”,所以 ii 正在导入

导入“Foundation/Foundation.h”或

导入“基础/NSException.h”

但什么也没发生,有人知道 NSInvalidArgumentException 在哪个包或库中?还是我的错误?还是绝对有必要使用超类 NSException 捕获所有异常?在开发人员文档中并没有这样显示。

此致。

4

2 回答 2

10

NSInvalidArgumentException不是异常类型。它是一个字符串,将在name异常的属性中返回。因此,您应该捕获您的异常,并且name属性不匹配,您可以重新@throw处理您不打算处理的异常,例如:

@try {
    // code that generates exception
}
@catch (NSException *exception) {
    if ([exception.name isEqualToString:NSInvalidArgumentException])
    { 
        // handle it
    }
    else
    {
        @throw;
    }
}

有关更多信息,请参阅异常编程主题

我必须承认,我同意 CodaFi 的担忧,即这不是对异常的适当使用。最好进行防御性编程,在调用 Cocoa 方法之前验证参数,并确保一开始就不会生成异常。如果您参考使用 Objective-C 指南编程的处理错误部分,异常是针对“程序员错误”的,他们说:

您不应该使用 try-catch 块来代替 Objective-C 方法的标准编程检查。

于 2013-08-07T00:53:20.190 回答
0

有人知道 NSInvalidArgumentException 在哪个包或库中?

它在 Foundation Framework 中的NSException.h. 正如 CodaFi 在评论中所写,它不是一个类型,它是一个字符串常量,声明为FOUNDATION_EXPORT NSString * const NSInvalidArgumentException;

因此,导入更多标头不会解决您的问题,因为@catch(NSInvalidArgumentException* exception )就像写作一样@catch(@"A string constant"* exception ),您有一个对象,其中需要一个类型。

话虽如此,不要使用异常进行流量控制。看看这个答案的最后部分关于 SO

于 2013-08-07T00:53:30.030 回答