2

当您抛出异常时,您可以输入一条方便的消息,以提供有关操作失败原因的更多信息。

显然,在通常会死掉的方法上抛出异常并不是一个好习惯。

MSDN 上的这篇文章同时建议了TryParse模式和Tester-Doer模式,但是这些模式都不允许您提取有关方法失败原因的任何信息。

是否有一种可接受的模式来传递安全失败的方法,让您收集更多关于失败原因的数据?

显然,您可以执行类似的操作public FailureReason TryParseWithMessage(string s, out MyClass myClass)public bool TryParseWithMessage(string s, out MyCLass myClass, out FailureReason failureReason)但对于该方法成功的正常情况,这些似乎有点脏...

4

2 回答 2

2

您可以使用特殊的类来封装结果,无论是成功案例还是失败案例。它的界面可能如下所示:

public interface IParseResult {
  // whether the operation succeeded
  bool Success { get; }
  // contains error messages, can also be a single string message
  IEnumerable<string> Messages { get; } 
  // the result of the operation in case of success, null otherwise
  MyClass MyClass { get; }
}

然后你的方法可以返回它:

IParseResult Parse(string s) ...

我在这里之前已经成功使用过它(我一般称它为操作结果),并带有一个自定义Message类。

于 2013-07-17T18:11:43.127 回答
2

我的建议是返回一个Tuple<StatusMessage, MyClass>. 然后你会做

var result = ParseWithStatus(data);
if (result.Item1 == StatusMessage.Success) return result.Item2;
else
{
    // handle each StatusMessage case that is a failure.
}

或类似的东西(例如,switch而不是if/else)。

于 2013-07-17T16:53:19.090 回答