正确的结构来检查使用NSError错误(Correct Structure to check for

2019-07-29 07:27发布

我编码了各种套路,我尽我所能,以保持它的整洁和重构。

方法我创建开始寻找类似下面的代码:

-(IBAction)buttonPress:(id)sender {
    // Create Document Shopping List with this document
    [self doSomething:&error];

    if(error) {
        [NSApp presentError:&error];
        return nil;
    }

    [self doSomethingElse:&error];

    if(error) {
        [NSApp presentError:&error];
        return nil;
    }

    [self doYetSomethingElse:&error];

    if(error) {
        [NSApp presentError:&error];
        return nil;
    }
}

我爱NSError,但是这似乎是处理我的所有错误的非常笨拙的方法。

有几个想法我已经有大约替代方法:

一)错误检查可以内置到doSomething的方法,doSomethingElse等,但后来我就不能退出按钮按下方法没有做某种形式的返回值检查,这将导致我回到了类似的结构。

B)我就可以建立的NSError为核心价值观察到,但一些关于这种感觉极其错误的。 我非常清楚的滥用与志愿的可能性,所以我想没有它尽一切可能徘徊无论。

当然我失去了真正的基本的东西在这里? 有没有一种方式,可以帮助我吗? 或者是这种结构可以吗?

Answer 1:

我认为这里没有给出答案都考虑到苹果的推荐做法。

基本上,你不应该检查的NSError对象,以确定是否出现了问题。 你检查,如果有问题通过检查,需要一个指针的指针的方法的返回值NSError

从苹果的文档 :

重要的成功或失败是由于方法的返回值指示。 虽然Cocoa方法,在可可误差区域间接返回错误的对象是保证返回这样的对象,如果该方法直接返回表示失败nilNO ,您应经常检查返回值是nilNO试图做的任何事情之前NSError对象。



Answer 2:

你的问题的要点是是否有可以让你的错误处理结构上的改进。 我想是这样,通过,要么通过提取多个码成单独的方法/函数基本上引入嵌套多个层,或通过引入嵌套在高电平样品的方法。

我们的想法是,当涉及到处理大多数的错误,你可能是在执行备用任务或者利害关系,或在失败和传播错误环比上涨,使一些负责任的控制器可以通过UI传达错误给用户。

使用这种想法的“传播或处理”,我会重写你这样的采样方法:

-(IBAction)buttonPress:(id)sender {

    // Create Document Shopping List with this document
    [self doSomething:&error];    
    if(error == nil) {
        [self doSomethingElse:&error];
        if (error == nil) {
            [self doYetSomethingElse:&error];
        }
    }

    if(error) {
        [NSApp presentError:&error];
    }    
}

需要注意的是有针对一个特定的方法引入太多的嵌套很好的理由。 嵌套如这基本上是一个短的替代提取方法。 它可能会更有意义,例如,认为“DoSomething的:”本身调用doSomethingElse :,它要求doYetSomethingElse:例如。 这会对该代码为IF-鸟巢的结构相同,但会可以说是更易于维护。

顺便说一句,我不是内嵌return语句的粉丝。 在这种特定情况下,样品的方法实际上并不要求返回值,但如果它没有,我宁愿一个局部变量设置为返回值,并只在流量控制的最后返回。 跳出一个函数或方法的过早的遇到莫名其妙的错误,恕我直言,一个肯定的方式。



Answer 3:

我认为真正的问题是,你在你的错误处理多大的粒度需要。 你的代码是从根本上正确的 - 但你可以通过检查错误不频繁,或使用像他与NSException答复中提到teabot一个包罗万象的做法干净的东西了。 很多返回的错误(如的NSFileManager的moveItemAtPath内置功能:)除了返回BOOL到提供NSError对象 - 所以你也可以使用嵌套的if语句,如果你不需要NSError信息。

总括而言,虽然,没什么不能做到这一点的好方法。 如果你的代码很长,志愿可能是一个很酷的解决方案。 我从来没有尝试过像这样的情况,虽然。



Answer 4:

注:当我发布这个我不知道任何的MacOS /可可例外辩论。 当你考虑这个答案请记住这一点。

为什么不使用的例外呢? 这将让你与你的方法错误参数分配和在一个地方处理你的错误。

-(IBAction)buttonPress:(id)sender {
    // Create Document Shopping List with this document
    @try {
        [self doSomething];
        [self doSomethingElse];
        [self doYetSomethingElse];
    } @catch (NSException* e) {
        [NSApp presentException:e];
    }
    return nil;
}

当然,您将需要抛出从您的doXXXX方法中所需要的例外:

NSException* e = [NSException exceptionWithName:@"MyException"
                                         reason:@"Something bad happened"
                                       userInfo:nil];
@throw e;


文章来源: Correct Structure to check for Errors using NSError