传递失败原因的常见失败方法

时间:2013-07-17 16:38:38

标签: c# error-handling

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

显然,对通常会死的方法抛出异常并不是一种好的做法。

This article on MSDN建议使用TryParse模式和Tester-Doer模式,但这两种模式都不允许您提取任何有关原因方法失败的信息

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

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

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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) ...

我在使用自定义hereMessage之前已成功使用它(我通常将其称为操作结果)。