我需要登录异常(甚至在发布版本)在我的应用程序。 我使用的是类的静态方法日志(异常前) 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
在运行时抛出? 我需要登录同样的方法除外。 请帮忙。
合同异常应该不同于普通的异常处理,因为合同应指定一个关于你的程序是,应该是真实的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() -毕竟,你仍然要执行终止。
赶在调用/任何上层功能的异常?
编辑:示例
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的。 如果你写的互动节目,别忘了通知动作:-)失败的用户