最后在catch之前阻止执行

bro*_*and 3 c# try-catch

据我所知,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)

Jon*_*Jon 7

据我所知,try-catch-finally语句,在异常被捕获后,最终块被执行.

不,那是错的.

finally在执行适用的catch子句块之后,或者在没有适用的情况下抛出异常之后立即执行该块catch.然而,这仅适用于catchfinally相同的try块-如果异常被传播,finally在运行之前任何catch和/或finally进一步的调用堆栈.

当函数抛出异常时,这如何应用,如下例所示.

foo被调用,它抛出,并finally执行它的块.由于没有catch异常传播并被捕获main.

如果在finally块中释放某些资源会导致初始异常无法解决该怎么办.

我不明白这个问题.

这是否意味着finally块抛出新的(另一个)异常,覆盖原始异常.

是的,这就是它的工作原理.