1

アプリケーションで (リリース バージョンであっても) 例外をログに記録する必要があります。クラスの静的メソッド Log(Exception ex)CLogを使用して例外をログに記録しています。コード コントラクトも使用しており、静的チェックと実行時チェックの両方を使用しています。次のコードを検討してください。

public void editCommit(CEmployee emp)
    {
        Contract.Requires<ArgumentNullException>(null != emp, "Null argument, Parameter name : emp");
        this.employee.Name = emp.Name;
        this.employee.Age = emp.Age;
    }

生成されたすべての警告を修正しない場合、ArgumentNullException実行時にスローされた例外をログに記録するにはどうすればよいですか? 同じメソッドで例外をログに記録する必要があります。助けてください。

4

2 に答える 2

2

契約の例外は、通常の例外とは異なる方法で処理する必要があります。これは、契約では、システムの状態に関係なく、100% 常に真であるべきプログラムに関する事実を指定する必要があるためです。コントラクトが失敗した場合、ほぼ確実にコードにバグがあることを意味します。コード コントラクト チームは、この場合に役立つ可能性のある障害を検出する別の方法を提供しています (マニュアルのセクション 7「ランタイム コントラクトの動作」を参照してください)。

2 つのオプションがあります。ContractFailedEvent のイベント ハンドラーを提供するか(この場合はこれをお勧めします)、代わりにContract Runtime クラスの完全な代替を提供することができます (詳細については、マニュアルを参照してください)。 .

イベント ハンドラーはできるだけ早く登録する必要があります。

static void Main(string[] args)
{
    InitialiseContractHandler();
    //...
}

public static void InitialiseContractHandler()
{
    Contract.ContractFailed += (sender, eventArgs) =>
    {
        eventArgs.SetHandled();
        eventArgs.SetUnwind();                  
        MyContractFailureLogger(eventArgs);
        Assert.Fail(eventArgs.Message);
    };
}

このパターンを使用する理由は、単体テストの目的でAssemblyInitializerメソッドから初期化メソッドを呼び出すこともできるようにするためです。

このように失敗を処理するように設定すると、コントラクト ランタイム自体が例外をスローするのを防ぐことができます

于 2013-01-17T09:46:46.107 に答える
0

呼び出し元/上位レベルの関数で例外をキャッチしますか?

編集:例

public void editCommit(CEmployee emp)
    {
        try
        {
           Contract.Requires<ArgumentNullException>(null != emp, "Null argument, Parameter name : emp");
           this.employee.Name = emp.Name;
           this.employee.Age = emp.Age;
         }
         catch( ArgumentNullException x )
         {
             System.Console.Error.WriteLine( "{0}: {1} @", typeof( x ).Name, x.Message );
             System.Console.Error.WriteLine( "{0}", x.StackTrace };
             //now throw the exception again so the caller can react to the error
             throw;
         }
    }

もちろん、他のライブラリを使用してエラーを記録することもできますが、私は log4net を好みます。対話型プログラムを作成する場合は、アクションが失敗したことをユーザーに通知することを忘れないでください:-)

于 2013-01-17T06:18:57.367 に答える