链式异常堆栈的示例

时间:2011-09-26 09:16:49

标签: c# .net exception trace

我对这些技术知之甚少,并且在查找异常堆栈的显示方面不是很成功。

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

对于链式异常,您将看到最后抛出的异常,但在处理另一个异常时抛出了最后一个异常,依此类推。例如:

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

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

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