iOS全局处理程序的NSError

4
我正在编写一款iOS应用程序的程序。阅读了苹果关于如何处理错误的指南后,我得出以下最重要的几点:
  • 异常是为程序员而设的
  • 对用户使用NSError
NSError通常作为带输出参数传递,其可以在内部使用并由调用者进行检查。然而,我想知道是否使用全局错误处理程序,即封装了NSError的单例,可以在被调函数内触发错误和错误处理。
这种方法有什么缺点吗?它是一种不好的做法吗?

我从未见过你所说的指南,但我猜测它是从API程序员的角度来讲述的——他会在内部处理异常(如果有处理的话),并使用 NSErrors 而不是异常来向 API 调用者报告问题。 - Hot Licks
1
我所指的指南是处理错误 - Sebastian Dressler
4个回答

1

MacOS X有一个错误响应链的概念,它是一种非正式协议,将错误沿着响应链传递直到被处理。出于某种原因,这在iOS上的Cocoa中没有实现,但存在几个第三方实现:

ErrorKit

ios-presentError

还有更多其他选择。

这种方法非常灵活,文档良好,在MacOS X上是最佳实践,通常比使用单例更可取。


1
看了一下ErrorKit,我想我会使用它,因为它有点符合我的最初想法。 - Sebastian Dressler

0

这样做是非常糟糕的,因为你的观点“NSError是为用户而设计的”完全不正确。NSErrors会告诉你的软件某个操作无法执行的原因。是否需要告知用户这是一个错误完全取决于具体情况。


从文档中得知:"Cocoa程序使用NSError对象来传递用户需要被告知的运行时错误信息。" NSError封装了错误信息以供用户查看。这就是为什么它具有本地化、错误原因和描述以及恢复选项。NSErrors绝对是为用户消费而设计的。 - quellish
@quellish - 对于大多数用户来说,NSError中的文本都是毫无意义的。它们的实际用途是记录日志以帮助诊断错误。 - Hot Licks
@HotLicks 在我看来,不向用户呈现NSError的原始内容是很清晰的。 - Sebastian Dressler

0
实际上,大多数错误需要在非常狭窄的上下文中处理,尝试将某些东西包装到NSError类中并没有什么好处。只需处理错误并继续执行即可。

0

iOS中的大多数异常都是“致命”的,无法有效处理(因此在iOS应用程序中使用异常处理程序是不寻常的)。

按照惯例,非致命错误通过返回代码或从被调用函数返回nil或零来报告。在许多这些情况下,可以使用error:参数(记录/转储生成的NSError值),当收到错误的返回代码时应该使用它。

(请注意,error:参数结果不是您检查是否发生错误的内容。相反,在其他地方出现错误的返回代码表明应记录/转储error:参数结果。)

很少有情况需要向用户报告NSError的内容 - 在大多数情况下,这些信息只对程序员有意义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接