在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
此处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作为第二参数。