最后在catch之前阻止执行

时间:2014-05-22 10:24:02

标签: c# try-catch

据我所知,try-catch-finally语句,在异常被捕获后,最终块被执行。当函数抛出异常时,这如何应用,如下例所示。如果某些资源在finally块中被释放,那么初始异常就不会发生。这是否意味着finally块抛出新的(另一个)异常,覆盖原始异常。

我知道你可以捕获可能在调用堆栈上方的try-finally语句的try块中抛出的异常。也就是说,您可以在调用包含try-finally语句(msdn documentation)的方法的方法中捕获异常。

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");
  }
}

输出:

foo
foo's finally called
Exception caught

3 个答案:

答案 0 :(得分:7)

  

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

不,那是错的。

finally块在执行适用的catch子句块后执行,或者在没有适用的catch存在的情况下抛出异常后立即执行。但是,这仅适用于同一catch块上的finallytry - 如果传播了异常,finally将在任何catch和/之前运行或finally进一步调用堆栈。

  

当函数抛出异常时,这是如何应用的,例如   下方。

调用

foo,它会抛出,并执行其finally块。由于没有catch异常传播并被main内部捕获。

  

如果在finally块中发布了一些资源,那么初始化怎么办?   例外情况不可能。

我不明白这个问题。

  

这是否意味着finally块抛出了新的(另一个)异常,   压倒原始例外。

是的,that's how it works

答案 1 :(得分:1)

这基本上就是你要做的事情:

 static void Main(string[] args)
 {
   try
   {
       try   
       {
          Console.WriteLine("foo");
          throw new Exception("exception");   //error occurs here
       }   
       finally   //will execute this as it is the first exception statement
       {
           Console.WriteLine("foo's finally called");   
       }   
    }
    catch (Exception e)  // then this
    {
       Console.WriteLine("Exception caught");
    }
 }

我还应该补充一点,无论try和catch块中发生了什么,都会执行finally块中的代码

答案 2 :(得分:0)

当你使用try-catch-finally时。 如果你的代码得到任何错误,那么它将首先捕获,然后最终。 如果你的代码没有抛出任何错误,那么它最后将调用finally,然后进一步执行。

this以良好的例子解释。