2010-04-05 113 views
3

我想要获取从asp.net中的dll引发的异常的函数名称。从DLL获取函数名称

+1

你的意思是你想获取抛出异常的方法的名称? – Elisha 2010-04-05 09:10:11

+0

是的,我需要在DLL中的方法的名称,抛出异常 – Hari 2010-04-05 09:15:13

回答

0

您应该能够利用堆栈跟踪

Exception.StackTrace Property

StackTrace Class

表示一个堆栈跟踪,它是一个或多个 堆栈帧的 有序集合。

StackFrame Class

甲的StackFrame被创建并上推 调用堆栈一个线程的执行期间由每个函数调用 。 堆栈帧始终包含 MethodBase信息,并且可选地包含文件名称,行号和 列号信息。

StackFrame信息将最多 信息与调试版本 配置。默认情况下,调试 构建包含调试符号,而 版本构建不包含。调试 符号包含大部分文件, 方法名称,行号和列 用于构造 StackFrame对象的信息。

0

您可以从例外中创建一个StackTrace类并分析这些帧。

例如:

public void Throw() 
{ 
    throw new MyException(); 
} 

public void CallThrow() 
{ 
    Throw(); 
} 

[Test] 
public void GetThrowingMethodName() 
{ 
    try 
    { 
     CallThrow(); 
     Assert.Fail("Should have thrown"); 
    } 
    catch (MyException e) 
    { 
     MethodBase deepestMethod = new StackTrace(e).GetFrame(0).GetMethod(); 
     string deepestMethodName = deepestMethod.Name; 
     Assert.That(deepestMethodName, Is.EqualTo("Throw")); 
    } 
} 
+0

仍然我不能得到该方法的名称,告诉我如何从DLL中抛出异常的方法的名称。 – Hari 2010-04-05 10:07:03

+0

@ram,你得到的结果是什么?你可以发表一个你是代码的例子,并调用引发异常的外部程序集吗? – Elisha 2010-04-05 10:19:14

+0

这里我的例子的代码: 空隙测试() { /*异常这里谈到*/ } 公共类方法{ 空隙负载() { 测试(); } } 这里class name'method'是一个dll文件,即时通讯从方法'test()'得到异常。但是堆栈跟踪以“load()”的形式返回方法的名称。我需要获取方法名称'test()'。 – Hari 2010-04-05 10:41:05

0

你可以尝试用system.diagnostic命名空间的帮助这里的堆栈跟踪的对象是linqpad测试的源代码,你可以尝试一下。

void Main() 
{ 
    try { 
     test(); 
    } 
    catch(Exception ex) { 
     StackTrace st = new StackTrace(); 
     st.GetFrame(1).GetMethod().Name.Dump(); 
    } 
} 

// Define other methods and classes here 


public void test() 
{ 
    throw new NotImplementedException(); 
}