收集进程中的错误并将其发送回调用方 - 最佳方法?

时间:2011-02-23 08:21:00

标签: c# .net architecture error-handling

我在类中有一个执行多个任务的方法(调用其他方法等)。整个过程可能会出现一些错误或问题,但这并不意味着该过程被中止。我希望在方法完成后,它会向调用者返回所有这些问题的列表,以便他可以决定如何处理它们。
实现这个的最佳方法是什么?
我想到的第一件事是让方法返回某种错误类的List,但我可能需要用它返回其他东西,这样就会出问题。另外,抛出异常并不好,因为这会阻止流程,我需要一路上收集错误,而不是停止执行并返回调用者。
我也在考虑提出调用者听到的某种事件,但这意味着有几个事件(对于每个错误),我只想让它发生一次。
想法?

3 个答案:

答案 0 :(得分:1)

一些方法

  1. 您的方法将收到一个“错误函数”的委托,该函数将被调用以报告每个错误。问题是你需要将这个委托传递给所有其他方法。
  2. 返回Tuple<RealResult, ErrorsList>,以便调用者可以检查结果和错误列表。
  3. 如果这是一个重复的功能,并且有许多方法需要报告错误 - 你可以编写一个名为ErrorReportable的特殊类,并编写LINQ运算符来对这种类型的对象进行排序(如果你知道Monad是什么 - 那么LINQ只是一个简单的monad而SelectMany就是它的“绑定”运算符。代码更清晰,但你需要做一些工作。

答案 1 :(得分:1)

我的第一个想法是创建一个可以作为这些错误的累加器的类,例如

class ProcessingErrors
{
  public void ReportError(...) { store the errror};
}

您将作为参数传递:

MyResult DoProcessing(RealArgs a, ProcessingErrors e)
{
  ....
  if(error) e.ReportError(...);
  ...
  return result;
}

答案 2 :(得分:0)

为此过程中的错误收集创建一个委托。将其传递给所有正在使用的类,并让他们在此过程中报告错误。让调用类收集并处理错误,或为其创建一个单独的类。如下所示:

public delegate void ErrorCollector(string errorDescription);

public class MainControl
{

    public void Execute()
    {

        new DoA(CollectErrors).DoStuff();
        new DoB(CollectErrors).DoStuff();

        //Display Errors encountered during processing in DoA and DoB
        foreach (string s in _errorList)
        {
            Console.WriteLine(s);
        }
    }

    public IList<string> ErrorList
    { get {return _errorList;} }


    private void CollectErrors(string errorDescription)
    {
        _errorList.Add(errorDescription);    
    }

    private readonly IList<string> _errorList = new List<string>();
}

public class DoA
{
    private readonly ErrorCollector _errorCollector;

    public DoA(ErrorCollector errorCollector)
    {
        _errorCollector = errorCollector;
    }

    public void DoStuff()
    {
        //Do something

        //Perhaps error occurs: 
        _errorCollector("ERROR IN DoA!!!");
    }
}

public class DoB
{
    private readonly ErrorCollector _errorCollector;

    public DoB(ErrorCollector errorCollector)
    {
        _errorCollector = errorCollector;
    }

    public void DoStuff()
    {
        //Do something

        //Perhaps error occurs: 
        _errorCollector("ERROR IN DoB!!!");
    }
}