NSError 自己做了啥,如果有的话?
Posted
技术标签:
【中文标题】NSError 自己做了啥,如果有的话?【英文标题】:What does NSError do on its own, if anything?NSError 自己做了什么,如果有的话? 【发布时间】:2012-10-26 15:02:11 【问题描述】:我希望开始将错误捕获添加到我的代码中,并且我想看看 NSError
对象自己为我做了什么,以及我必须自己添加什么。
查看this SO question 和the Apple Docs,看起来NSError
所做的只是保留数字错误代码、错误位置和错误描述。对于所有这三个项目,我必须在我的代码中指定它们。然后,如果我想做一些事情,比如跳到当前正在执行的任何方法的末尾(如果应用程序试图运行它们很可能会导致崩溃),或者显示UIAlertView
告诉用户有错误,我也必须自己指定所有这些,对吗?
我有点初学者,所以还有什么我想考虑做的吗?
【问题讨论】:
澄清一下,我知道在需要时如何显示警报和编写 goto。我主要是在尝试验证是否由我来做这些事情。例如,我不想编写自己的代码来显示警报,如果有一个非空错误对象会自动创建一个警报,让我的用户有双重警报进行排序。 【参考方案1】:NSError
是错误信息的容器,它自己不会做任何事情。该类的设计使您的代码的不同部分可以以标准化的方式相互交流错误信息。只需在采用 NSError**
的方法中设置错误不会执行任何操作 - 调用者有责任检查 *error
是否非nil
,跳到方法末尾,显示本地化描述,提示用户一个动作,等等。
但是,NSError
足够灵活,可以让您完成所有这些操作:调用者可以提供几乎任何类型的信息;您可以跟踪恢复尝试,向用户显示本地化消息,或将其他信息存储在 NSError
对象中,并将其返回到调用链的下方。
注意:Cocoa 框架方法一般要求你在使用NSError
之前检查直接返回值,而不是检查错误是否为nil
。如果方法指示失败,则错误保证有效,但不保证成功为nil
,即使您事先将其设置为nil
。
【讨论】:
谢谢,第一句话正是我想要的——称它为“信息容器”是一种很好的表达方式。帖子的其余部分还有很多其他好的信息。 Cocoa 框架方法一般要求在使用NSError
前检查直接返回值,而不检查错误是否为nil
。如果方法指示失败,则错误保证有效,但不保证成功为nil
,即使您事先将其设置为nil
。
@JoshCaswell 多么棒的评论!我将它逐字复制到答案中。非常感谢!
不客气;很高兴你觉得它有帮助。它旨在回应您第一段的最后一句话,这似乎有点误导。【参考方案2】:
NSError 是作为错误的封装提供的。这是一个很好的 OO 实践,它允许其他签名对其进行强类型化。这很像 Java 和 C# 中的 Exception 类。它还允许您创建一个指针以传递给以 NSError 作为参数的方法,在方法完成后,您可以检查 NSError 以了解您的应用程序可以处理的条件。
【讨论】:
啊,所以它主要是作为一个标准化的对象来明确处理错误。我对 Java 或 C# 不太熟悉,但我知道我的公司有很多旧的 Fortran 代码,它们会有类似integer errorNumber = 0
的东西,并通过调用传递它,并在发生某些事情时将其设置为非零。然后有一个很大的选择案例块,它将根据数字显示相关消息。所以 NSError 几乎是一种将所有信息整合到一个包中的方法,而不是必须在一堆单独的部分中处理它?
是的,先生,这是主要用法。想象一下,如果您必须分别传递错误代码、消息、描述和堆栈跟踪。这只是一个简单的封装机制。希望能为您解决问题。【参考方案3】:
您可能希望发布一些代码来帮助说明您要完成的工作。
您可以做的一件事是,在调用将填充错误对象的方法后,检查错误是否不为零,或评估错误对象的属性。
它可能看起来像:
-(void)someMethod
NSError *error;
[self myMethod:&error];
if ( error )
// handle the error, display an alert, etc ...
else
// do other stuff when no error occurs
【讨论】:
我并不是在问“我该如何编码”,更像是“我需要为此编码,还是会为我编码”。事后看来,我可能应该包含一些代码,以防有人后来发现 is 正在寻找代码,但你在这里所拥有的几乎就是我的想法。我在我的问题中添加了一条评论,以澄清我在问什么。以上是关于NSError 自己做了啥,如果有的话?的主要内容,如果未能解决你的问题,请参考以下文章