如何同时使用代码契约记录错误(How to Log error while using Code C

2019-10-17 14:48发布

我需要登录异常(甚至在发布版本)在我的应用程序。 我使用的是类的静态方法日志(异常前) 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在运行时抛出? 我需要登录同样的方法除外。 请帮忙。

Answer 1:

合同异常应该不同于普通的异常处理,因为合同应指定一个关于你的程序是,应该是真实的100%的时间,而无需考虑系统的状态。 如果合同失败,这意味着你几乎可以肯定在你的代码中的错误。 该代码契约队提供了发现故障的另一种方式,这可能是在这种情况下非常有用(见第7章,“运行合同行为”手册中)。

你有两个选择:你可以提供的ContractFailedEvent的事件处理程序(这是我想在这种情况下推荐),或者提供合同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() -毕竟,你仍然要执行终止。



Answer 2:

赶在调用/任何上层功能的异常?

编辑:示例

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的。 如果你写的互动节目,别忘了通知动作:-)失败的用户



文章来源: How to Log error while using Code Contracts