Дизайн кода ошибки ведения журнала, требуется ввод - PullRequest
0 голосов
/ 07 июля 2010

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

У меня есть интерфейс ILog, в котором есть два метода, представленные для части регистрации кода ошибок в проекте.FlagError и GetErrorCode;FlagError устанавливает бит в целое число, каждый бит, представляющий, что была выдана определенная ошибка., GetErrorCode (который был бы возвращаемым значением для метода Main) возвращает указанное целое число.

Сначала я предположил, используяenum в каждом приложении, чтобы содержать список возможных кодов ошибок.

Но проблема в том, как именно я бы передал пользователям, что код ошибки 'XYZ' означает, что приложение попадало в эти ненормальные состояния во времядружественное выполнение?

Интерфейс ILog: (Методы записи имеют перегрузки)

interface ILog
{
    void FlagError (int errorCode);
    int GetErrorCode ();

    #region Other ILog Methods

    void WriteError(string  message);
    void WriteWarning(string  message);
    void WriteInfo(string  message);
    void WriteDebug(string  message);

    #endregion
}

Класс журнала:

abstract class Log : ILog
{
    public void
    FlagError (int errorCode)
    {
        if (errorCode == 0 || errorCode == int.MinValue || errorCode != (errorCode & -errorCode))
        {
            throw new IndexOutOfRangeException ();
        }

        if ((m_errorCode & errorCode) == errorCode)
             return;

        m_errorCode += errorCode;
    }

    public int
    GetErrorCode ()
    {
        return m_errorCode;
    } 


    #region Other ILog Methods    

}

Я предположил использование атрибута для каждого перечислениязначение с описанием этой ошибки, а затем просто небольшой процесс или что-то, чтобы помочь «разобрать» код ошибки в удобочитаемом описании.

Но, ИДК, есть идеи?

Ответы [ 2 ]

2 голосов
/ 07 июля 2010

Спасибо за ваши комментарии, ребята, я принял их во внимание и нашел решение, которое (хотя и не самое лучшее) будет работать для того, что мне нужно сделать.

В итоге я создал атрибут Description, который я добавилк каждому значению перечисления, а затем создайте метод расширения 'GetDescription' в Enum.Затем, всякий раз, когда я отмечаю ошибку, ее описание записывается в консоль / файл / окно или в w / e.

Я полагаю, мне следовало бы раскрыть еще несколько методов ILog, чтобы это решение было найдено.

Новый метод FlagError:

public void
FlagError (Enum  errorCode)
{
   int  errorValue = Convert.ToInt32 (errorCode);

   if (errorValue == 0 || errorValue == int.MinValue
      || errorValue != (errorValue & -errorValue))
   {
      WriteError ("ErrorCode {0}: {1}",
                  errorValue,
                  errorCode.GetDescription ());

      m_errorCode = int.MinValue;

      throw new IndexOutOfRangeException ();
   }

   if ((m_errorCode & errorValue) == errorValue)
      return;

   WriteError ("ErrorCode {0}: {1}",
               errorValue,
               errorCode.GetDescription ());

   m_errorCode += errorValue;
}

Метод расширения GetDescription:

public static string 
GetDescription (this Enum  @enum)
{
   StringBuilder  builder;

   var  descriptionAttributes = @enum.GetType ()
                                     .GetCustomAttributes (
                                          typeof (DescriptionAttribute),
                                          false) as DescriptionAttribute [];

   if (descriptionAttributes == null || descriptionAttributes.Length == 0)
      return string.Empty;

   builder = new StringBuilder ();

   foreach (DescriptionAttribute  description in descriptionAttributes)
   {
      builder.Append (description.Description);
      builder.AppendLine ();
   }

   return builder.ToString ();
}

Описание Атрибут:

public sealed class DescriptionAttribute : Attribute
{
   public 
   DescriptionAttribute (string  description)
   {
      m_description = description;
   }

   public string 
   Description
   {
      get
      {
          return m_description;
      }
   }


   private readonly string m_description;
}

Если у кого-либо есть дополнительные входные данныеЯ хотел бы услышать это.

0 голосов
/ 07 июля 2010

Я бы, вероятно, пошел с перечислением, поместив эти значения и код регистрации в общую сборку, которая может вызываться каждым приложением. Возможно, это не самое элегантное решение, но оно выполнит свою работу и позволит вам перейти к более важным вещам - например, к хорошей базовой бизнес-логике, которая не вызывает слишком много ошибок:

Другой вариант может заключаться в том, чтобы поместить коды ошибок и понятные человеку описания в файл конфигурации. Таким образом, у вас будет некоторая гибкость для улучшения сообщений об ошибках. Я никогда не пробовал этого, но теперь, когда я об этом думаю, во многих ситуациях я вижу, что это настоящее благо.

...