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% 正确。如果合约失败,这意味着您几乎可以肯定您的代码中存在错误。Code Contracts 团队提供了另一种发现故障的方法,这在这种情况下可能很有用(请参阅手册中的第 7 节“运行时合同行为”)。

您有两个选择:您可以为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方法调用初始化方法以进行单元测试。

将失败设置为以这种方式处理将防止合约运行时本身引发异常,这就是我包含Assert.Fail()的原因- 毕竟,您仍然希望终止执行。

于 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 回答