代码之家  ›  专栏  ›  技术社区  ›  Andrey Chernukha

苹果检查返回值而不是错误的模式背后的基本原理是什么?

  •  3
  • Andrey Chernukha  · 技术社区  · 7 年前

    苹果的电子商务指南 Using and Creating Error Objects

    NSError *theError;
    BOOL success = [myDoc writeToURL:[self docURL] ofType:@"html" error:&theError];
    
    if (success == NO) {
        // Maybe try to determine cause of error and recover first.
        NSAlert *theAlert = [NSAlert alertWithError:theError];
       [theAlert runModal]; // Ignore return value.
    }
    

    并附上以下声明:

    我一直在想为什么这个模式如此重要?为什么我们总是要检查返回值?如果我们检查错误是否为零,有什么问题?

    2 回复  |  直到 7 年前
        1
  •  9
  •   amon    7 年前

    该设计具有许多潜在优势:

    • 如果我们总是在访问错误之前检查函数是否失败,那么我们可以对多个函数使用相同的错误指针。否则,我们可能会得到以前的失败,而不是最近函数的失败。

    • 这使得验证代码更容易编写。例如,函数可以默认设置错误。如果所有验证都通过,函数可以简单地返回success,而不必重置错误变量。

    • 一个函数在调用其他函数时可以使用相同的错误指针,但是这些辅助函数的失败并不一定意味着顶级函数的失败。

    在您的特定情况下,变量 NSError *theError;

        2
  •  2
  •   uliwitness    7 年前

    假设您使用其他几种方法实现了一种方法:

    -(BOOL)sendCachedRequestReturningError: (NSError**)err {
        BOOL success = [self readCachedRequestReturningError:err];
        if (!success && (*err).domain == MYFileDomain && (*err).errorCode == MYFileNotFoundCode) {
            success = [self sendUncachedRequestReturningError:err];
        }
    
        return success;
    }
    

    现在这里有4个代码路径:

    1. 有一个缓存的请求。我们马上回来 success == YES 一切都很好。
    2. 尝试从缓存读取时发生不可恢复错误。 readCachedRequestReturningError: err 设定 success == NO presentError: 或者别的什么
    3. 尝试执行网络请求时出错。与#2相同, 犯错误 已设置,并且 成功==否 .
    4. 没有缓存,但我们可以发出网络请求。 readCachedRequestReturningError: 将设置 有效地 NSError{MYFileDomain, MYFileNotFoundCode} ,但是 sendUncachedRequestReturningError: 会成功,会成功 成功==是 ,不要碰 犯错误 犯错误 当一切顺利时,您将认为是错误,而不是检查返回值。

    注意:上面的代码大大简化了,因为我们只关心错误。当然,在实际的程序中,这些方法可能会有另一个返回参数用于请求的实际回复,或者返回回复或 nil 而不是 success BOOL . 它也可能会检查 犯错误 是 NULL .