2

我正在用 vs2010 编写一个自动化(测试项目)。我已经有一个带有相关 Info(string)、Debug(string) 和 Error(string, Exception) 方法的 Logger 类,它实现了将消息正确写入文件。

现在,我知道我的信息日志必须专门写在我的测试代码中,但是无论如何都会自动编写错误消息作为抛出异常的实现?异常是设计的一部分(我需要抛出它们以确定每个测试的通过/失败状态)。

我可以将所有代码包装在 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 来记录错误是一个正确的设计。

我想到了两件事:

  1. 创建一个侦听器线程,它将捕获我的异常,记录它们并重新抛出它们......
  2. 操作 Exception 类以使用 mt Log.Error() (或从中派生 MyException 并操作我的代码以仅抛出 MyException)。
  3. 我已经尝试安装 Enterprise-Library 并使用日志记录块,但我不确定这是否适合我的需要(而且我无法获取 LogWriter 的实例或使用 Logger.Write 无论如何) .

我走对了吗?还有其他方法可以实现这种“自动写入错误”吗?

谢谢, 埃拉德

4

2 回答 2

1

满足您的要求的一种可能方法是使用逻辑包装您的函数和方法以处理日志记录/仪器。您可以让您的测试类都扩展一个自定义基类,或者只创建一个实用程序类并调用包装功能。请参见下面的示例。

实用程序类

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);
    }
于 2013-02-13T13:50:49.560 回答
0

您应该只在应用程序的最高级别上实现 try-catch 块。在那里你可以处理你的异常并记录它。

对于未处理的异常,您可以连接一个事件,例如:AppDomain.CurrentDomain.UnhandledException

在 Asp 中,您可以使用 On_Error。这取决于项目的类型。

于 2013-02-13T13:09:25.167 回答