自动记录一个异常c#
本文关键字:一个 异常 记录 | 更新日期: 2023-09-27 17:58:53
我正在用vs2010编写一个自动化(测试项目)。我已经有一个Logger类,它具有相关的Info(字符串)、Debug(字符串)和Error(字符串,Exception)方法,可以实现将消息正确写入文件。
现在,我知道我的信息日志必须专门写在我的测试代码中,但有没有办法将错误消息自动写为抛出异常的实现?异常是设计的一部分(我需要抛出它们来确定每个测试的通过/失败状态)。
我可以完成将所有代码包装在try-catch中的基本实现,在catch块中写入Logger.error(),然后再次抛出异常,如下所示:
public class Test
{
["TestMethod"]
public void RunTest()
{
try
{
//run my code here
}
catch (Exception ex)
{
Logger.Error("Error message", ex);
throw;
}
}
}
但我不确定使用try-catch来记录错误是否是一个合适的设计。
我想到了两件事:
- 创建一个侦听器线程,它将捕获我的异常,并记录它们然后再扔
- 操作Exception类以使用mt Log。Error()(或派生MyException,并操作我的代码以仅抛出MyException)
- 我已经尝试安装企业库,并使用日志记录块,但我不确定这是否符合我的需求(我已经无法获取LogWriter的实例或使用Logger。写无论如何)
我走的路对吗?有没有其他方法可以实现这种"自动写入错误"?
谢谢,Elad
满足您的需求的一种可能方法是用处理日志记录/检测的逻辑包装您的函数和方法。您可以让测试类都扩展一个自定义基类,或者只创建一个实用程序类并调用包装功能。请参阅下面的示例。
公用事业类
class Utility
{
public static void Wrap(Action method, params object[] parameters)
{
try
{
//additional logging / events - see example below
Debug.WriteLine("Entering : {0} @ {1}", method.Method.Name, DateTime.Now);
foreach (var p in parameters)
{
Debug.WriteLine("'tParameter : {0}", new object[] { p });
}
method();
//additional logging / events - see example below
Debug.WriteLine("Exiting : {0} @ {1}", method.Method.Name, DateTime.Now);
}
catch (Exception ex)
{
//Log exception
throw;
}
}
public static T Wrap<T>(Func<T> method, params object[] parameters)
{
try
{
//additional logging / events - see example below
Debug.WriteLine("Entering : {0} @ {1}", method.Method.Name, DateTime.Now);
foreach (var p in parameters)
{
Debug.WriteLine("'tParameter : {0}", new object[]{p});
}
var retValue = method();
//additional logging / events - see example below
Debug.WriteLine("Exiting : {0} @ {1}", method.Method.Name, DateTime.Now);
return retValue;
}
catch (Exception ex)
{
//Log exception
throw;
}
}
}
样品使用
public static void SayHello()
{
Utility.Wrap(() =>
{
SayHello(" world ");
});
}
public static void SayHello(string name)
{
Utility.Wrap(() =>
{
Console.WriteLine("Hello {0}", name);
}, name);
}
public static int GetCount(string s)
{
return Utility.Wrap(() =>
{
return string.IsNullOrEmpty(s) ? 0 : s.Length;
}, s);
}
您应该只在应用程序中的最高级别上实现try-catch块。在那里你可以处理你的异常并记录它。
对于未处理的异常,您可以挂接一个事件,例如:AppDomain.CurrentDomain.UnhandledException
在Asp中,您可以使用On_Error。这取决于项目的类型。