链式异常堆栈的例子
本文关键字:堆栈 异常 | 更新日期: 2023-09-27 18:09:44
我对这些技术了解不多,在发现异常堆栈如何显示方面也不是很成功。
因此,有几个基本问题:
- 如何显示两个独立的连续例外?
- 如何显示几个连锁异常?
- 根本原因显示在堆栈的顶部还是底部?
自己尝试一下很容易。例如:
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
当两个独立的连续异常被抛出时,第一个异常将中断程序的正常执行,直到它被处理为止。然后,如果第一个异常没有终止程序,第二个异常将以同样的方式抛出。
对于链式异常,您将看到最后抛出的异常,但最后一个异常是在处理另一个异常时抛出的,依此类推。例如:
void Foo()
{
throw new FooException("foo");
}
void Bar()
{
try
{
Foo();
}
catch(FooException ex)
{
throw new BarException("bar", /* innerException = */ ex);
}
}
所以在堆栈的顶部,你会看到bareexception在底部,FooException。希望我没有错过什么。