2011-09-26 44 views
1

我对这些技术了解不多,并且在查找异常堆栈显示方式方面不太成功。链式异常堆栈示例

因此,有几个基本问​​题:

  • 如何显示2个独立的连续异常?
  • 如何显示几个链式例外?
  • 是显示在堆栈顶部还是底部的根本原因?
+1

你指的是什么“链”?你的意思是[Exception.InnerException](http://msdn.microsoft.com/en-us/library/system.exception.innerexception.aspx)属性? –

回答

3

自己试试这个很容易。例如:

using System; 

class Test 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Top(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    } 

    static void Top() 
    { 
     try 
     { 
      Middle(); 
     } 
     catch (Exception e) 
     { 
      throw new Exception("Exception from top", e); 
     } 
    } 

    static void Middle() 
    { 
     try 
     { 
      Bottom(); 
     } 
     catch (Exception e) 
     { 
      throw new Exception("Exception from middle", e); 
     } 
    } 

    static void Bottom() 
    { 
     throw new Exception("Exception from bottom"); 
    } 
} 

结果(前两行是在一行上,如果它是足够长的时间):

System.Exception: Exception from top ---> System.Exception: Exception from middle 
     ---> System.Exception: Exception from bottom 
    at Test.Bottom() in c:\Users\Jon\Test\Test.cs:line 43 
    at Test.Middle() in c:\Users\Jon\Test\Test.cs:line 33 
    --- End of inner exception stack trace --- 
    at Test.Middle() in c:\Users\Jon\Test\Test.cs:line 37 
    at Test.Top() in c:\Users\Jon\Test\Test.cs:line 21 
    --- End of inner exception stack trace --- 
    at Test.Top() in c:\Users\Jon\Test\Test.cs:line 25 
    at Test.Main(String[] args) in c:\Users\Jon\Test\Test.cs:line 9 
+0

正是我要证明的。最后一点:https://ideone.com/99sKB – sehe

+0

我使用的是外部C#/ .Net程序,我没有为此设置任何环境(因此我的问题;)) – Rolf

+0

@Rolf:你没有.NET安装在任何地方?所有你需要的是框架和记事本... –

0

当两个独立的连续抛出异常,第一个将中断正常程序的执行,直到它被处理。然后,如果程序没有被第一个异常终止,则第二个异常将以相同的方式抛出。

至于链式异常,您将看到最后抛出的异常,但处理另一个异常等时抛出最后一个异常。例如:

void Foo() 
{ 
    throw new FooException("foo"); 
} 

void Bar() 
{ 
    try 
    { 
     Foo(); 
    } 
    catch(FooException ex) 
    { 
     throw new BarException("bar", /* innerException = */ ex); 
    } 
} 

因此,在堆栈的顶部,您将看到BarException并在底部显示FooException。希望我没有错过任何东西。