qqq*_*qqq 2 c# exception finally try-catch try-finally
很长一段时间,我认为它可以让我释放finally块中的所有资源,并且我认为如果try块中发生异常,那么该块中的资源仍然会被释放finally。但情况似乎并非如此。
我有以下一段代码:
using System;
public sealed class Program
{
public static void Main()
{
try {
int zero = 0;
int i = 1/zero;
} finally {
Console.WriteLine("divide by zero"); //the line is never called
}
}
}
Run Code Online (Sandbox Code Playgroud)
我从来没有到达打印到控制台的行。这意味着finally在这种情况下,我将无法在块内抛出异常时释放块中的资源try。
所以,我相信有两件事:要么我遗漏了什么,要么try+finally组合在 C# 中没有用例。第二个语句是有道理的,因为我将获得与上面的代码和下面的代码产生的相同的功能:
using System;
public sealed class Program
{
public static void Main()
{
int zero = 0;
int i = 1/zero;
Console.WriteLine("divide by zero"); //the line is never called
}
}
Run Code Online (Sandbox Code Playgroud)
但我担心我可能会在这里遗漏一些东西。那么,有人可以确认该组合没有用或证明它没有用吗?
更新
在能够finally在其小提琴中调用块的注释之后,我在 VS Code 中再次检查,但仍然看不到输出。
你的假设是不正确的(有时)https://dotnetfiddle.net/hjqmOS
通过使用 finally 块,您可以清理在 try 块中分配的任何资源,并且即使在 try 块中发生异常也可以运行代码。通常,finally 块的语句在控制离开 try 语句时运行。控制转移可以作为正常执行、break、continue、goto 或 return 语句的执行,或从 try 语句传播异常的结果而发生。
虽然有些情况下它不运行
在处理的异常中,保证运行关联的 finally 块。但是,如果未处理异常,则 finally 块的执行取决于如何触发异常展开操作。反过来,这取决于您的计算机的设置方式。
这是重要的部分
通常,当未处理的异常结束应用程序时,是否运行 finally 块并不重要。但是,如果您在 finally 块中的语句即使在这种情况下也必须运行,一种解决方案是在 try-finally 语句中添加一个 catch 块。或者,您可以捕获可能在调用堆栈上方的 try-finally 语句的 try 块中抛出的异常。
| 归档时间: |
|
| 查看次数: |
1938 次 |
| 最近记录: |