2012-03-07 59 views
9

我写了下面的测试代码,即使我很确定会发生什么:在finally块中抛出异常之后返回值会发生什么?

static void Main(string[] args) 
{ 
    Console.WriteLine(Test().ToString()); 
    Console.ReadKey(false); 
} 

static bool Test() 
{ 
    try 
    { 
     try 
     { 
      return true; 
     } 
     finally 
     { 
      throw new Exception(); 
     } 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

果然,程序写的“假”到控制台。我的问题是,最初返回的真实情况会怎样?有没有办法获得这个值,如果可能的话,在catch块中,或者如果不是最初的finally块呢?

只是为了澄清,这仅用于教育目的。我绝对不会在实际的程序中制造这样一个令人费解的异常系统。

+0

几乎是一个重复:[是否合法,可以在finally块中访问返回值?](http://stackoverflow.com/q/304847/256431) – 2012-03-09 00:27:15

回答

5

不,不可能得到该值,因为毕竟只返回bool。不过,你可以设置一个变量。

static bool Test() 
{ 
    bool returnValue; 

    try 
    { 
     try 
     { 
      return returnValue = true; 
     } 
     finally 
     { 
      throw new Exception(); 
     } 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("In the catch block, got {0}", returnValue); 
     return false; 
    } 
} 

虽然这很麻烦。而为了教育的目的,答案是否定的。

+0

好的,谢谢你的回答。好吧。 – aboveyou00 2012-03-07 00:38:43

+3

这实际上在VB.NET中很有趣,其中局部变量返回结果'Test'是为您预定义的。我刚刚测试过它,并且在等效的“Catch”块中它是“True”,即使在内部的Try块中只使用了Return True也是如此。当然,函数返回'False'。 – 2012-03-07 01:57:05

+2

@MarkHurd:这很有趣。我需要在某个地方使用:)嗯... – Ryan 2012-03-07 02:39:28

相关问题