据我所知,try-catch-finally语句,在异常被捕获后,最终块被执行.当函数抛出异常时,这如何应用,如下例所示.如果在finally块中释放某些资源会导致初始异常无法解决该怎么办.这是否意味着finally块抛出新的(另一个)异常,覆盖原始异常.
我知道你可以捕获可能在调用堆栈上方的try-finally语句的try块中抛出的异常.也就是说,您可以在调用包含try-finally语句的方法(msdn文档)的方法中捕获异常.
static void foo()
{
try
{
Console.WriteLine("foo");
throw new Exception("exception");
}
finally
{
Console.WriteLine("foo's finally called");
}
}
static void Main(string[] args)
{
try
{
foo();
}
catch (Exception e)
{
Console.WriteLine("Exception caught");
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
foo
foo's finally called
Exception caught
Run Code Online (Sandbox Code Playgroud)
据我所知,try-catch-finally语句,在异常被捕获后,最终块被执行.
不,那是错的.
finally在执行适用的catch子句块之后,或者在没有适用的情况下抛出异常之后立即执行该块catch.然而,这仅适用于catch与finally相同的try块-如果异常被传播,finally在运行之前任何catch和/或finally进一步的调用堆栈.
当函数抛出异常时,这如何应用,如下例所示.
foo被调用,它抛出,并finally执行它的块.由于没有catch异常传播并被捕获main.
如果在finally块中释放某些资源会导致初始异常无法解决该怎么办.
我不明白这个问题.
这是否意味着finally块抛出新的(另一个)异常,覆盖原始异常.
是的,这就是它的工作原理.