0

だから、私は少し問題で立ち往生しています。誰かがこのデザインに喜んで与えるかもしれないいくつかの追加の入力を持っているかどうか私は興味がありました。

デザインのエラーコードログ部分に2つのメソッドが公開されているILogインターフェイスがあります。FlagErrorおよびGetErrorCode; FlagErrorは整数にビットを設定し、各ビットは特定のエラーがスローされたことを表します。GetErrorCode(Mainメソッドの戻り値)はその整数を返します。

enum私は最初、各アプリケーションで可能性のあるErrorCodeのリストを含めるためにを使用することを推測しました。

しかし、問題は、エラーコード「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

おそらく列挙型を使用し、これらの値とログ コードを、各アプリケーションから呼び出すことができる共通のアセンブリに配置します。これはこれまでで最も洗練されたソリューションではないかもしれませんが、仕事は完了し、より重要なことに移ることができます - あまり多くのエラーをスローしない優れたコア ビジネス ロジックなど:-)。

もう 1 つのオプションは、エラー コードと人間が読める説明を構成ファイルに入れることです。そうすれば、エラー メッセージを改善する柔軟性が得られます。私はそれを試したことはありませんが、今考えてみると、多くの状況で本当に恩恵を受けていることがわかります.

于 2010-07-06T22:03:10.143 に答える