@throws 或 NSError 哪个适用于客观 C api 类型的方法

Posted

技术标签:

【中文标题】@throws 或 NSError 哪个适用于客观 C api 类型的方法【英文标题】:@throws or NSError which one is appropriate in for objective C api kind of methods 【发布时间】:2013-07-09 21:21:16 【问题描述】:

哪一个是最受青睐的目标 C 异常处理? NSError 指针,它在其中提供带有消息详细信息的指针或@throws,它强制调用者处理异常并显示一些优雅的消息。谢谢。

还有请告诉我哪一个是内存效率高的。

【问题讨论】:

您将异常处理与错误处理混淆了。 Apple 制作两个不同的类是有原因的 - NSExceptionNSError 简而言之,除非发生内部不一致、断言失败等情况,否则不要抛出异常。如果 Web API 返回错误、用户输入的密码无效或您的岳母胃痛,请使用 NSError 将其报告给调用者函数。 【参考方案1】:

与 Java 不同,在 Objective-C 中,异常仅用于处理不可恢复的状态。这意味着,例如,您不会捕获 EXC_BAD_ACCESS,而是调试应用程序并纠正问题。

Java 异常的Objective-C 等价物是NEError 和空指针模式。例如,如果格式化程序因为字符串不代表数字而未能将字符串格式化为数字,则它返回 nil。还有一种格式化数字的方法,该方法采用 NSError 双指针返回错误描述。

因此,要处理错误,您通常会实现这样的方法:

- (id) object : (out NSError**) error

    BOOL ok= ... 
    if(!ok)
    
        if(error)
            *error= ...
        return nil;
    
    return someObject;

【讨论】:

以上是关于@throws 或 NSError 哪个适用于客观 C api 类型的方法的主要内容,如果未能解决你的问题,请参考以下文章

从类型 (_,_,_) throws -> Void 到非抛出函数类型 (NSData?, NSURLResponse?, NSError?) -> Void 的无效转换

什么是适用于 OSX 或 Windows XP 或 DOS 的好的 C 编译器?

手机浏览器哪个好用

为啥使用 NSError 间接参数而不是 @try/@catch/@finally

NSError 为 nil 但进入非 nil 状态

throw throws Throwable 关联于区别