Сбор ошибок в процессе и отправка их обратно вызывающей стороне - лучший подход? - PullRequest
2 голосов
/ 23 февраля 2011

У меня есть метод в классе, который выполняет несколько задач (вызов других методов и т. Д.). Весь процесс может иметь некоторые ошибки или проблемы, но это не означает, что процесс прерывается. Я хочу, чтобы после завершения метода он возвращал вызывающему список всех этих проблем, чтобы он мог решить, что с ними делать.
Каков наилучший подход для реализации этого?
Первое, что приходит мне в голову, - заставить метод возвращать List какого-либо класса ошибок, но мне может понадобиться вернуть что-то еще с ним, так что это будет проблемой. Кроме того, выбрасывать исключения не хорошо, потому что это остановит поток, и мне нужно собирать ошибки по пути, а не останавливать выполнение и возвращаться к вызывающей стороне.
Я также думал о том, чтобы вызвать какое-то событие, которое слушатель слушает, но это будет означать несколько событий (для каждой ошибки), и я просто хочу, чтобы это произошло один раз.
идеи?

Ответы [ 3 ]

1 голос
/ 23 февраля 2011

Моя первая идея - создать класс, который был бы аккумулятором для этих ошибок, например,

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

, который вы передадите в качестве параметра:

MyResult DoProcessing(RealArgs a, ProcessingErrors e)
{
  ....
  if(error) e.ReportError(...);
  ...
  return result;
}
1 голос
/ 23 февраля 2011

Несколько подходов

  1. Ваш метод получит делегата в «функцию ошибки», которая будет вызываться для сообщения о каждой ошибке. Проблема в том, что вам нужно передать этот делегат всем другим методам.
  2. Возвращает Tuple<RealResult, ErrorsList>, чтобы вызывающий мог просмотреть и результат, и список ошибок.
  3. Если это повторяющаяся функциональность и есть много методов, которые должны сообщать об ошибках - вы можете написать специальный класс с именем, скажем, ErrorReportable и написать операторы LINQ, которые упорядочивают объекты этого типа (если вы знаете, что такое Monad - тогда LINQ - это просто простая монада, а SelectMany - оператор связывания). Код чище, но вам нужно поработать.
0 голосов
/ 23 февраля 2011

Создайте делегата для сбора ошибок по пути.Передайте это всем используемым классам, и пусть они сообщают об ошибках по пути.Позвольте вызывающему классу собирать и обрабатывать ошибки, или создать отдельный класс для этого.Примерно так:

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!!!");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...