C# 链式异常堆栈示例

C# 链式异常堆栈示例,c#,.net,exception,trace,C#,.net,Exception,Trace,我对这些技术了解不多,在发现异常堆栈的显示方式方面也不是很成功 因此,有几个基本问题: 如何显示两个独立的连续异常 如何显示多个链接异常 根本原因显示在堆栈的顶部还是底部 你自己试试这个很容易。例如: using System; class Test { static void Main(string[] args) { try { Top(); } catch (Exception e)

我对这些技术了解不多,在发现异常堆栈的显示方式方面也不是很成功

因此,有几个基本问题:

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

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

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");
    }
}
void Foo()
{
    throw new FooException("foo");
}

void Bar()
{
    try
    {
        Foo();
    }
    catch(FooException ex)
    {
        throw new BarException("bar", /* innerException = */ ex);
    }
}
结果(如果足够长,前两行将在一行上):


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

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

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");
    }
}
void Foo()
{
    throw new FooException("foo");
}

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

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

你说的“链”是指什么?你是说财产吗?正是我要展示的。画龙点睛:我使用的是一个外部C#/.Net程序,我没有为此设置任何环境(因此我的问题;)@Rolf:你没有在任何地方安装.Net吗?你所需要的只是框架和记事本…@Jon,我不认为记事本和csc.exe是初学者的好选择。像LINQPad这样的软件可能更好。@svick:我的观点是,记事本和csc.exe足以在不安装任何其他软件的情况下测试出这个问题。