NSError:在方法中传递错误

时间:2012-10-25 05:27:06

标签: objective-c ios nserror

我不确定这是否正确:

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    [myParser parse:targetObject error:&parserError];

    if (parserError != nil) {
        *error = parserError;
    }
}

行:

*error = parserError;

我将参数中的错误设置为本地错误,是否正确完成?

或者我应该这样做:

error = &parserError;

代替?

2 个答案:

答案 0 :(得分:5)

在尝试取消引用之前,您需要确保error不是nil。此外,不需要本地NSError。它以这种方式编写代码:

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    [myParser parse:targetObject error:error];
}

但是如果你真的想要locale变量(或者用于演示目的)。那么这个:

- (void)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    [myParser parse:targetObject error:&parserError];
    if (error && parserError) {
        *error = parserError;
    }
}

此外,大多数具有NSError输出参数的方法通常具有BOOL返回值或一些其他返回值以指示是否成功。您不应该依赖error参数来指示是否存在错误。

- (BOOL)parseSomething:(id)targetObject error:(NSError **)error {
    NSError *parserError = nil;
    BOOL ok = [myParser parse:targetObject error:&parserError];
    if (error && parserError) {
        *error = parserError;
    }

    return ok;
}

答案 1 :(得分:0)

在这种情况下,您可能希望在没有中间变量的情况下进一步传递错误。但是,您需要确保myParser对象正确处理错误参数。

- (void)parseSomething:(id)targetObject error:(NSError **)error
{
    [myParser parse:targetObject error:error];
}

如果你想在这里处理它,你需要确保指向指针error的指针指向某个东西,否则你在取消引用它时会崩溃。

例如:该方法就像这样调用

[object parseSomething:targetObject error:NULL];

以下行会导致崩溃:

*error = parserError;

正确的代码如下所示:

- (void)parseSomething:(id)targetObject error:(NSError**)error
{
    NSError* parserError = nil;
    [myParser parse:targetObject error:&parserError];
    if (error != nil)
    {
        *error = parserError;
    }
}

parserError为零时,但error为零时,不是问题。