2011-09-26 45 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。希望我沒有錯過任何東西。