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

时间:2019-01-02 12:24:25

标签: c# try-catch-finally finally try-finally

在此论坛上,我们已经看到许多有关try-catch-finallytry-finally结构的问题。

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

这里a link进入Microsoft解释的最终解释结构。我已经读过了!

在以下文章中写道:

  

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

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

    在此论坛上,我已经了解了StackOverFlowException(此时不会执行finally块),但是当我throw时,finally块被执行。那么StackOverFlowException呢?

  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();
            }
        }
    }
}    

3 个答案:

答案 0 :(得分:6)

  1. 是的,在大多数情况下,如果您不使用Environment.Exit(0)Application.Exit()之类的内容(例如他的回答中提到的“普通人”)中止执行,总是将执行finally块。

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

  2. 在调试器中不会调用finally块,因为如果顶级中存在未处理的异常(因为没有顶级异常处理程序),则调试器会立即关闭。有关更详细的说明,请参见this answer。如果您在未连接调试器的情况下运行应用程序,则会调用finally块-感谢bommelding弄清楚了这一点。

  3. 每次需要确保正确清理时,都使用finally块。有关更详细的说明,请参见this answer

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

答案 1 :(得分:0)

  

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

在以下几种独特的情况下,返回后将不会调用finally块:如果首先调用System.exit(),或者VM崩溃了。

  

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

在这里阅读:Can a finally block be interrupted/suspended?

  
      
  1. 我们通常在哪些情况下使用try-finally?
  2.   

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

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

答案 2 :(得分:0)

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

2-由于未处理异常,因此您的finally不会被调用。 Microsoft文档指出:“通常,当未处理的异常结束应用程序时,是否运行finally块并不重要。但是,如果在finally块中有即使在那种情况下也必须运行的语句,一种解决方案是添加try-finally语句的一个捕获块。”比较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