如何在C#中使用try-finally构造?

How to use try-finally construction in C#?

我们在这个论坛上看到了很多关于 try-catch-finallytry-finally 结构的问题。

答案的数量增加了问题的数量,所以我也很少。

这里是 a link 微软的解释 try-finally 结构。我已经读过了!

在下面的文章中写道:

Within a handled exception, the associated finally block is guaranteed to be run. However, if the exception is unhandled, execution of the finally block is dependent on how the exception unwind operation is triggered. That, in turn, is dependent on how your computer is set up.

  1. 我是否正确理解在 try-catch-finally 中构造 finally 将始终执行? (不包括 Environment.FastFail()

    我在这个论坛上读到过 WhosebugExceptionfinally 块在这种情况下不执行),但是当我 throw 它时, finally 块被执行。那么 WhosebugException 是什么?

  2. 为什么不调用finally块?(在下面的代码中)?

  3. 我们一般在哪些情况下使用try-finally?

  4. finally 块依赖于哪个 PC 设置?


using System;
namespace ConsoleApplication1
{
class Program
    {
    static void Main(string[] args)
        {
            try
            {
                throw  new Exception(); 
            }                              
            finally
            {
                Console.WriteLine("finally");
                Console.ReadKey();
            }
        }
    }
}    
  1. 是的,在大多数情况下,如果您不使用 Environment.Exit(0)Application.Exit() 之类的东西中止执行(就像提到的普通人在他的回答中)。

    对于 WhosebugException 和其他深层应用程序崩溃,它不能 运行 因为当堆栈已满时,此线程中没有剩余内存来执行任何正常操作。因此,当您自己抛出异常时,并没有真正完整的堆栈,应用程序可以继续运行。

  2. finally 块不会在调试器中调用,因为如果在顶层有未处理的异常,调试器会立即关闭,因为没有顶层异常处理程序。有关更深入的解释,请参阅 this answer。如果您 运行 没有附加调试器的应用程序将调用 finally 块 - 感谢 bommelding 解决了这个问题。

  3. 每次需要确保正确清理时都使用 finally 块。有关更深入的解释,请参阅 this answer

  4. 这是一个棘手的问题,我认为这是为了描述 PC 设置的影响,例如病毒扫描程序在尝试创建缓冲区溢出或类似的可能危急情况时终止程序。同样,finally 块的执行可以通过 data execution prevention 或其他安全功能来阻止。

1.Am i correctly understand that in try-catch-finally construction finally will always be executed? (Excluding Environment.FastFail())

finally 块将不会在 return 之后在几个独特的场景中被调用:如果 System.exit() 首先被调用,或者如果 VM 崩溃。

2.Why finally block is not called?(In the code below)?

阅读此处:Can a finally block be interrupted/suspended?

  1. For which cases we generally use try-finally?

try{} finally{} 应该在您无法处理异常但需要清理资源的情况下使用。

或者在我们的程序中发生一些异常异常后显示一些东西并优雅地退出总是更好。

1 - 视情况而定。使用 finally 块的想法是清理 try 块中分配的资源。即使在 try 块中发生异常,您也可以 运行 在 finally 块中编写代码。但是,finally 块在已处理的异常中保证为 运行。如果异常未处理,则 finally 的执行取决于异常展开操作的触发方式。

2 - 你的 finally 没有被调用,因为异常未被处理。 Microsoft 文档指出 "Usually, when an unhandled exception ends an application, whether or not the finally block is run is not important. However, if you have statements in a finally block that must be run even in that situation, one solution is to add a catch block to the try-finally statement." 比较 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-finally 处的示例以了解已处理异常和未处理异常之间的区别。

在这个问题上阅读更多内容 Why use finally in C#?

来源 https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-finally https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/try-catch-finally