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

Ole*_*kii 4 c# finally try-catch-finally try-finally

我们在这个论坛上看到过很多关于try-catch-finallytry-finally建设的问题.

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

这是Microsoft解释try-finally构建的链接.我已经读过了!

在下面的文章中写道:

在处理的异常中,保证运行关联的finally块.但是,如果未处理异常,则finally块的执行取决于如何触发异常展开操作.反过来,这取决于您的计算机的设置方式.

  1. 我是否正确地理解在try-catch-finally施工finally中将永远执行?(不包括Environment.FastFail())

    我已经在这个论坛上读到过StackOverFlowException(这个finally块没有在这个场合执行过),但是当我throw这个时,finally块被执行了.那有什么关系StackOverFlowException

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

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

  4. 从什么PC设置finally块依赖?


using System;
namespace ConsoleApplication1
{
class Program
    {
    static void Main(string[] args)
        {
            try
            {
                throw  new Exception(); 
            }                              
            finally
            {
                Console.WriteLine("finally");
                Console.ReadKey();
            }
        }
    }
}    
Run Code Online (Sandbox Code Playgroud)

Com*_*eak 6

  1. 是的,在大多数情况下,最终块将永远如果你不放弃的东西,如执行执行Environment.Exit(0)Application.Exit()(如在他的回答中提到普通人).

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

  2. 如果在顶层存在未处理的异常,则调试器不会在调试器中调用finally块,因为没有顶级异常处理程序.请参阅此答案以获得更深入的解释.如果您在没有附加调试器的情况下运行应用程序,则会调用finally块 - 感谢bommelding用于计算出来.

  3. 每次需要确保正确清理时,都使用finally块.请参阅此答案以获得更深入的解释.

  4. 这是一个棘手的问题,我认为这是为了描述来自PC设置的效果,例如病毒扫描程序在尝试创建缓冲区溢出或类似可能的关键情况时终止程序.类似地,可以通过数据执行防止或其他安全特征来防止最终块的执行.