Objective c 如果有的话,NSError自己做什么?

Objective c 如果有的话,NSError自己做什么?,objective-c,nserror,Objective C,Nserror,我希望开始在我的代码中加入错误捕获,我想看看NSError对象本身为我做了什么,以及我自己需要添加什么 查看和,看起来所有的NSError都是保留一个数字错误代码、错误位置和错误描述。对于这三个项目,我必须在代码中指定它们。然后,如果我想跳到当前正在执行的任何方法的末尾(如果应用程序试图运行它们,很可能会导致崩溃),或者显示一个UIAlertView告诉用户有错误,我也必须自己指定所有这些,对吗 我有点初学者,所以还有什么我想考虑的吗?< /P> < P> nSerror被提供作为错误的封装。这

我希望开始在我的代码中加入错误捕获,我想看看
NSError
对象本身为我做了什么,以及我自己需要添加什么

查看和,看起来所有的
NSError
都是保留一个数字错误代码、错误位置和错误描述。对于这三个项目,我必须在代码中指定它们。然后,如果我想跳到当前正在执行的任何方法的末尾(如果应用程序试图运行它们,很可能会导致崩溃),或者显示一个
UIAlertView
告诉用户有错误,我也必须自己指定所有这些,对吗


<>我有点初学者,所以还有什么我想考虑的吗?< /P> < P> nSerror被提供作为错误的封装。这是一个很好的OO实践,它允许其他签名强烈反对它。这与Java和C#中的异常类非常相似。它还允许您创建一个指针,将其传递到一个以NSError作为参数的方法中。在该方法完成后,您可以检查NSError以了解应用程序可以处理的条件。

您可能希望发布一些代码来帮助说明您试图实现的目标

您可以做的一件事是,在调用将填充错误对象的方法之后,检查错误是否为nil,或者评估错误对象的属性

它可能看起来像:

-(void)someMethod {
    NSError *error;

    [self myMethod:&error];

    if ( error ) {
        // handle the error, display an alert, etc ...
    }
    else {
        // do other stuff when no error occurs
    }
}

NSError
是错误信息的容器,它自己不做任何事情。该类的设计使代码的不同部分能够以标准化的方式相互传递错误信息。只需在采用
NSError**
的方法中设置一个错误,什么也做不了——调用者有责任检查
*error
是否为非
nil
,跳到方法末尾,显示本地化描述,提示用户执行操作,等等

然而,
NSError
足够灵活,可以让您做到这一切:调用者可以提供几乎任何类型的信息;您可以跟踪恢复尝试,向用户显示本地化消息,或将其他信息存储在
NSError
对象中,然后在调用链的下游返回


注意:Cocoa框架方法通常要求您在使用
NSError
之前检查直接返回值,而不是检查错误是否为
nil
。如果该方法指示失败,则该错误保证有效,但如果成功,则不能保证该错误为
nil
,即使您事先将其设置为
nil

为了澄清这一点,我知道在需要时如何显示警报和编写GOTO。我主要是想验证这些事情是否由我来做。例如,我不想编写自己的代码来显示警报,如果有一个非空的错误对象会自动创建警报,这会让我的用户有两个警报需要排序。谢谢,第一句话正是我想要的——称它为“信息容器”是一个很好的表达方式。文章的其余部分也有很多其他好的信息。Cocoa框架方法通常要求您在使用
NSError
之前检查直接返回值,而不是检查错误是否为
nil
。如果该方法指示失败,则该错误保证有效,但如果成功,则不能保证该错误为
nil
,即使您事先将其设置为
nil
。@JoshCaswell这是一个多么好的注释啊!我一字不差地把它抄进了答案。非常感谢你!不客气;很高兴你觉得它有用。这是为了回应你第一段的最后一句话,这似乎有点误导。我不是在问“我该如何编写此代码”,更像是“我是否需要编写此代码,或者是否为我编写此代码”。事后看来,我可能应该包括一些代码,以防有人在以后发现这些代码时正在寻找代码,但这里的内容基本上正是我所想的。我在我的问题中添加了一条评论来澄清我的问题。啊,所以它主要是作为一个标准化的对象来明确地处理错误。我不太熟悉Java或C#,但我知道我的公司有很多旧的Fortran代码,这些代码会有类似于
integer errorNumber=0
的内容,并通过调用传递它,当出现问题时将其设置为非零。然后有一个大的select case块,根据数字显示相关消息。因此,N错误是一种将所有信息汇总到一个包中的方法,而不是将其分为一堆单独的部分进行处理?是的,先生,这是主要用途。想象一下,如果您必须分别传递错误代码、消息、描述和堆栈跟踪。这只是一个简单的封装机制。希望这能帮你解决问题。