在objective-c中返回错误

Jac*_*cob 10 cocoa cocoa-touch objective-c nserror

我对objective-c很新,我开始想知道处理和捕获错误的常用/标准/正确方法是什么?

似乎有可能使用NSError来做到这一点,这是一个好主意还是劫持可可?

Tim*_*Tim 17

我很确定NSError类是做什么的 - 提供有关错误的详细信息.您将看到的最常见的模式是一个采用指向NSError对象的指针的方法,如:

- (id)doSomethingWithArgument:(id)arg error:(NSError **)error
Run Code Online (Sandbox Code Playgroud)

该方法nil为执行某些操作的结果返回一些值(或可能),但如果调用失败,则会在传递的指针上放置一个NSError对象,其中包含有关失败的详细信息.如果方法遇到错误,您的文档负责指定返回的内容.

想到的另一种方法是@throw- @catch块; 然而,在Objective-C中@throw,异常可能在计算上相当昂贵,而且通常只建议在真正特殊情况下这样做.

编辑:哇,事实证明很多人@throw对异常有很强烈的意见.总结一下(非常有帮助的)关于这个问题的评论:

  • 抛出异常应该经常处理程序员错误(应该永远不会发生的情况等); 异常应用于普通错误处理.相反,使用error上面演示的方法或发布NSNotification的实例.
  • 如果最后大量使用@throw/ @catchblocks,请非常小心它们周围的逻辑.Objective-C提供了许多方法来分离在其他线程中运行的方法,或延迟执行等.在编写代码时要非常小心地考虑所有这些可能性.

最后,另一个非常有效的观点:

  • 如果确实使用error传递给方法的对象,则返回值应指示它.不要尝试两者都做(返回部分有效的对象设置error对象).

  • 除了致命错误之外,不要使用异常.永远不会.返回值必须明确指示错误.除非*返回值表示错误,否则不要触摸`error`参数*. (7认同)
  • 继续这个概念,即使是集中式错误处理的想法也有比Cocoa中的异常更好的实现.我经常在一些中央错误处理对象观察到的NSNotifications中抛出错误,以提供用户反馈.当与NSError的重试逻辑封装相结合时,这可以使"发布通知并返回"非常有效的解决用户影响错误的解决方案. (4认同)
  • 尝试@throw将被捕获到范围之外的东西在ObjC中也有许多微妙的逻辑问题.如果你被NSTimer叫做怎么办?谁将捕获异常(并避免崩溃)?ObjC异常仅仅不足以处理常见的ObjC习语.它们通常仅用于处理编程错误.如果您需要一个丰富的错误对象供一般使用,NSError绝对是正确的方法. (2认同)
  • 为了澄清,Cocoa中的"真正异常情况"几乎总是导致程序员错误,并且通常是不可恢复的,或者至少可以通过适当和必要的检查轻松避免.抛出异常只是为了向程序员发出信号并不是Objective-C中的一个好习惯,现在它甚至不鼓励在Java中,不是因为计算成本,而是因为它极大地增加了客户端代码的复杂性. (2认同)