0

所以,我遇到了一个小问题。我很好奇是否有人愿意为这个设计提供一些额外的意见。

我有一个 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    

}

我推测在每个枚举值上使用一个带有该错误描述的属性,然后只需要一个小过程或其他东西来帮助将错误代码“解析”为人类可读的描述。

但是Idk,有什么想法吗?

4

2 回答 2

2

感谢您的评论,我考虑到了他们,并找到了一个(虽然不是最好的)可以满足我需要的解决方案。

我最终创建了一个添加到每个枚举值的 Description 属性,然后在 Enum 上创建了一个“GetDescription”扩展方法。然后,每当我标记错误时,它的描述都会被写入控制台/文件/窗口或 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;
}

如果有人有任何额外的意见,我很想听听。

于 2010-07-07T15:30:46.047 回答
0

我可能会使用枚举,将这些值和日志记录代码放入可由每个应用程序调用的通用程序集。它可能不是有史以来最优雅的解决方案,但它可以完成工作,让您继续处理更重要的事情——比如不会引发太多错误的良好核心业务逻辑:-)。

另一种选择可能是将错误代码和人类可读的描述放入配置文件中。这样您就可以灵活地改进错误消息。我从未尝试过,但现在我想到它,我可以看到它在许多情况下都是一个真正的福音。

于 2010-07-06T22:03:10.143 回答