编程语言
首页 > 编程语言> > 如何在C#中使用try-finally构造?

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

作者:互联网

我们在这个论坛上看到过很多关于try-catch-finally和try-finally结构的问题.

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

这里是a link进入微软解释试试 – 终极建设.我已经读过了!

在下面的文章中写道:

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.

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

我已经在这个论坛上读到了关于StackOverFlowException(在这种情况下最终没有执行的块),但是当我抛出它时,finally块被执行了.那么StackOverFlowException是什么?
>为什么不调用finally块?(在下面的代码中)?
>在哪些情况下我们通常使用try-finally?
>从什么PC设置finally块是什么?

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

解决方法:

>是的,在大多数情况下,如果不使用Environment.Exit(0)或Application.Exit()(如他的答案中提到的Common Man)中止执行,则始终会执行finally块.

对于StackOverFlowException和其他深度应用程序崩溃,它无法运行,因为当堆栈已满时,此线程中没有剩余内存来执行任何正常操作.因此,当您自己抛出异常时,没有真正的完整堆栈,应用程序可以继续运行.
>在调试器中没有调用finally块,因为如果没有顶级异常处理程序,则顶层有未处理的异常会立即关闭调试器.有关更深入的解释,请参阅this answer.如果您在没有附加调试器的情况下运行应用程序,则会调用finally块 – 感谢bommelding用于计算出来.
>每次需要确保正确清理时,都使用finally块.有关更深入的解释,请参阅this answer.
>这是一个棘手的问题,我认为这是为了描述来自PC设置的效果,例如病毒扫描程序在尝试创建缓冲区溢出或类似的可能危急情况时终止程序.类似地,data execution prevention或其他安全功能可以防止执行finally块.

标签:c,try-catch-finally,finally,try-finally
来源: https://codeday.me/bug/20190527/1161521.html