在C#中重新显示一个异常

本文关键字:异常 一个 显示 新显示 | 更新日期: 2023-09-27 18:26:39

我正在使用Ranorex,这是一个基于c#的测试自动化工具,有一个问题:异常处理和重新引发异常。我对c#编程还很陌生,所以请耐心等待!考虑以下代码:

子类/方法。。

try
{
    do something;
    'unhandled exception on line 150'
}
catch (exception)
{
    throw;
}

父类/方法

try
{
     childmethod();
}
catch (exception ex)
{
    report.info("Info",ex.Stacktrace);
}

我想做的是报告异常发生的行号,在子类/方法中,但在父类异常处理程序中。这样,在每个子类/方法中,我们都可以将异常重新抛出(抛出)到主类/方法(即Ranorex术语中的测试用例)。在父异常处理程序中,我们还有其他事情要做,比如报告系统详细信息、关闭应用程序和测试失败。我们只想在一个地方做这件事,因此被列入顶级课程。然而,使用上面的代码,stracktrace显示了重新抛出的子异常处理程序中的行号,以及调用子方法的行号。如果我们可以从堆栈中提取类似格式的东西,这也会很有用

Class = 'class name' & Method = 'method name' & Line Num = 'line num' 

而不是整个堆栈竞争消息。

我们使用的是.net v4.0

谢谢你的帮助。

StackTrace:

The stacktrace information is: at System.Data.DataRow.GetDataColumn(String columnName)
at System.Data.DataRow.get_Item(String columnName)
at ABCTest.SUD.Plat.NewFU.NewFUUserCode.MainMethod(String testDataInstanceId) in c:'Ranorex Local Code'ABCTest'ABCTest'SUD'Plat'NewFU'NewFUUserCode.cs:line 103
at ABCTest.SUD.Plat.NewFU.NewFUUserCode.MainMethod(String testDataInstanceId) in c:'Ranorex Local Code'ABCTest'ABCTest'SUD'Plat'NewFU'NewFireFUUserCode.cs:line 130
at ABCTest.Tests.ManageFAndS.ManACA_IO_One.MainMethod() in c:'Ranorex Local Code'ABCTest'ABCTest'Tests'ManageFAndS'ManACA_IO_One.cs:line 59

在C#中重新显示一个异常

此处http://weblogs.asp.net/fmarguerie/archive/2008/01/02/rethrowing-exceptions-and-preserving-the-full-call-stack-trace.aspx有一个解决方案。我不确定我会在代码中使用它,因为它基于一个未记录的方法(但它仍然可以在.NET 4.0中工作)

private static void PreserveStackTrace(Exception exception)
{
    MethodInfo preserveStackTrace = typeof(Exception).GetMethod("InternalPreserveStackTrace",
        BindingFlags.Instance | BindingFlags.NonPublic);
    preserveStackTrace.Invoke(exception, null);
}
static void MethodChild()
{
    try
    {
        throw new ArgumentException();
    }
    catch (Exception ex)
    {
        // Very important! Do it before rethrowing
        PreserveStackTrace(ex);
        throw;
    }
}

SO上的这个响应解释了这个问题:不能有两个相同方法的堆栈帧。一个方法=一个堆栈帧。

要获得有关抛出异常的位置的信息,可以使用StackTrace类:

StackTrace st = new StackTrace(ex, true);
StackFrame frame = st.GetFrame(0);
MethodBase method = frame.GetMethod();
// What you want!
string methodName = method.Name;
string className = method.DeclaringType.FullName;
int lineNumber = frame.GetFileLineNumber();

将异常传递给构造函数并将CCD_ 1作为第二参数。