2013-01-17 29 views
1

我需要在我的应用程序中记录异常(即使在发布版本中)。 我正在使用类CLog的静态方法日志(异常ex)来记录异常。 我也使用代码合同,并使用静态和运行时检查。 请考虑下面的代码:如何在使用代码合同时记录错误

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?我需要以相同的方法记录异常。 请帮忙。

+0

为什么要求用相同的方法记录它?为什么不把它与所有其他未处理的异常一起收集到顶级异常处理程序中? –

回答

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的。 如果您编写交互式程序,请不要忘记通知用户操作失败:-)

+0

我实际上试图找出是否有任何方法可以用相同的方法捕捉异常。 –

+0

另外我想知道的是记录异常的正确方法。即使在发布版本中,我也需要记录所有异常。但我也热衷于使用代码合同来减少错误。请建议我如何将两者结合起来以获得最佳结果。 –

+0

上面的代码给出了以下错误“错误\t:在try块内的合同部分。” –

2

合同异常应该与普通异常处理方式不同,因为合同应指定一个关于您的程序的事实,应该是真实的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() - 毕竟,您仍然希望执行终止。

+0

我遵循MVVM体系结构来开发WPF应用程序。能否请你建议我如何登录anothre线程从 1>合同例外生成的错误 2>未处理的异常(在这种情况下,我们应该处理,并登录DispatcherUnhandledException ??) 3>异常 –

+0

我不工作与WPF,所以我不能帮你在那里。如果您想知道处理未处理的异常和跨线程异常的最佳实践,或者一般情况下(如日志框架)的“如何登录”,则应该将这些作为单独的问题提出。他们与代码合同没有任何关系。 –