2012-03-21 38 views
4

我有一个方法Foo()做了一些艰苦的工作,并在UI层我有一个按钮来调用该方法。
我想要做的就是调用方法并显示一个消息框,如果Foo()方法有问题。返回元组<布尔,字符串>而不是抛出异常()?

我有两个选择设计方法的签名:

1.Tuple

Tuple<bool, string> Foo() 
{ 
    if(!DoHardWorkA()) return Tuple.New(false, "cannot do hardwork A"); 
    if(!DoHardWorkB()) return Tuple.New(false, "cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 

2.Exception

void Foo() 
{ 
    if(!DoHardWorkA()) throw new ProgramSpecificException("cannot do hardwork A"); 
    if(!DoHardWorkB()) throw new ProgramSpecificException("cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 

两者DoHardWorkA()和DoHardWorkB()是外部方法那我没有控制他们,他们返回真/假表明结果。

从逻辑上说,我认为我应该选择2,因为它们确实是例外;但为了一致性,我想选择1.

您更喜欢哪一个,为什么?

+0

这是C#去了?你应该用你使用的语言来标记你的问题。 – asawyer 2012-03-21 18:10:56

+6

重要的问题是:*失败非常罕见,或常见?*如果它非常罕见,那么*抛出异常,然后处理它*。如果失败很常见,那么*返回报告失败性质的数据*并像处理其他任何数据一样处理数据。 – 2012-03-21 18:49:56

回答

2

抛出异常并以一致的方式处理它会更好。

如果因为任何其他原因Foo失败,那么它也将被处理。假设一个scenerio。

void UIMethod() 
{ 
    Tuple<Result, Error> ret = Foo(); 
    if(ret.Error) 
    MessageBox.Show(ret.Error); 
} 

现在因为需求的变化,你必须在Foo之前​​调用另一个方法,它也可以抛出异常。然后它变得复杂。

这样做更容易。

void UIMethod() 
{ 
    try{ 
     MethodBeforeFoo(); 
     var ret = Foo(); 
    } 
    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

} 
0

我曾经做过的事情是在失败时成功返回null或错误消息。例外的是不适当的,因为失败是有可能和其他开发人员喜欢“的时候抛出异常中断”

String Foo() 
{ 
    if(!DoHardWorkA()) return "cannot do hardwork A"; 
    if(!DoHardWorkB()) return "cannot do hardwork B"; 

    return null; 
} 
0

使用异常有你有可能(*)的原因更容易识别比所提出的元组的advnatage与运行返回值。为了弄清使用元组时出现什么样的错误,你必须解释容易出错的字符串值。使用异常,您可以根据异常的类型确定错误类型。

(*)取决于如何异常使用 - 如果你扔一个通用的异常的时候,它不会是不同

当然,你可以使用一个整数的元组指示类型的问题,但错误类型的数值不像Exception类型那样具有描述性(同样,假设您没有使用常规类型,例如Exception)。

1

这真的取决于你的需要。像这样修改你的代码,它也会处理未处理的异常。

Tuple<bool, string> Foo() 
{ 
try 
{ 
    if(!DoHardWorkA()) return Tuple.New(false, "cannot do hardwork A"); 
    if(!DoHardWorkB()) return Tuple.New(false, "cannot do hardwork B"); 

    return Tuple.New(true, String.Empty); 
} 
catch 
{ 
    return Tuple.New(false, "cannot do hardwork A"); 
} 

}

2

如果你正在写你正在做的是调用这些外部方法做了一些工作,而这种方法是他们周围的包装,那么为什么抛出一个异常,“处理”的问题在你的方法和继续,抛出异常是很多许多倍更昂贵。

你的具体情况,你正在做的是做了一些工作,并显示一个消息框来显示它是否正确执行,所以我与选项1

相关问题