返回 Tuple<bool, string> 而不是抛出异常()?

AZ.*_*AZ. 6 c# exception return-value

我有一个方法 Foo() 做了一些艰苦的工作,在 UI 层我有一个按钮来调用该方法。
我想要做的就是调用该方法并在 Foo() 方法出现问题时显示一个消息框。

我有两种选择来设计方法签名:

1.元组

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);
}
Run Code Online (Sandbox Code Playgroud)

2.异常

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);
}
Run Code Online (Sandbox Code Playgroud)

DoHardWorkA() 和 DoHardWorkB() 都是我无法控制的外部方法,它们返回 true/false 指示结果。

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

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

Ami*_*abh 2

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

如果 Foo 由于任何其他原因失败,那么它也会被处理。假设一个场景。

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

现在,由于需求发生变化,您必须在 Foo 之前调用另一个方法,它也可能引发异常。然后事情就变得复杂了。

这样做要容易得多。

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

}
Run Code Online (Sandbox Code Playgroud)