据我所知,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
答案 0 :(得分:7)
据我所知,try-catch-finally语句就在之后 异常被捕获最终块被执行。
不,那是错的。
finally
块在执行适用的catch
子句块后执行,或者在没有适用的catch
存在的情况下抛出异常后立即执行。但是,这仅适用于同一catch
块上的finally
和try
- 如果传播了异常,finally
将在任何catch
和/之前运行或finally
进一步调用堆栈。
调用当函数抛出异常时,这是如何应用的,例如 下方。
foo
,它会抛出,并执行其finally
块。由于没有catch
异常传播并被main
内部捕获。
如果在finally块中发布了一些资源,那么初始化怎么办? 例外情况不可能。
我不明白这个问题。
这是否意味着finally块抛出了新的(另一个)异常, 压倒原始例外。
答案 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以良好的例子解释。