c# - 尝试后终于没有被调用

标签 c# exception try-finally

出于某种原因,在我的控制台应用程序中,我无法运行 finally block 。我正在编写这段代码来测试 finally block 是如何工作的,所以它非常简单:

static void Main()
{
    int i = 0;
    try
    {
        int j = 1 / i; // Generate a divide by 0 exception.
    }
    finally
    {

        Console.Out.WriteLine("Finished");
        Console.In.ReadLine();
    }
}

起初我有 problem described here但后来我尝试在 Visual Studio 之外运行该程序时出现“程序已停止响应”错误。

最佳答案

因为您没有顶级异常处理程序,.Net 运行时会为您捕获异常并在程序最终有机会运行之前中止程序。这说明了这一点:

static void Main() 
{
  try
  {
      int i = 0;
      try
      {
         int j = 1 / i; // Generate a divide by 0 exception.
      }
      finally
      {
          Console.Out.WriteLine("Finished");
          Console.In.ReadLine();     
      }
  }
  catch (Exception ex)
  {
      Console.WriteLine(ex.ToString());
  }
}

使用这段代码,异常现在在调用链中更高层的 try...catch 中处理(恰好在同一方法中),因此嵌入的 finally 将被执行。 catch 不必在引发异常的同一函数中,它可以在调用链中的任何位置。

编辑:最初您的程序似乎不确定何时何地捕获异常。但是想想你的应用程序的边界,外部世界与你的代码交互的地方——通常它们是有限的并且定义明确。所以对于控制台应用程序,边界是 Main 方法,这是您可以放置​​顶级异常处理程序的地方。对于 Web 窗体应用程序,边界包括按钮单击事件(用户正在与您的 UI 交互)之类的东西,因此您也可以在其中包含异常处理程序。对于类库,边界通常是调用库的应用程序的边界,而不是库本身。因此,不要在库中捕获异常(除非您可以明智地从中恢复),而是让它们冒泡到调用应用程序。

关于c# - 尝试后终于没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12163149/

相关文章:

java - 我的测试用例中预期异常的正确组合是什么?

java - 字符串索引超出范围 : 0 Error For using RedirectAttributes in Spring Boot

c# - 在 Linux 中,当我使用 nuget pack 时,它会引发 "Cannot create a package"

c# - 字符串的实际长度

c++ - Windows/MinGW下相当于 "SIGINT"(posix)信号,用于捕获 "CTRL+C"

c# - 在 C# 中,try-finally 如何捕获原始异常

java - 如何让try-finally中的finally等待线程完成?

C# Web 服务 - 然后返回 最后 - 先发生什么

c# - 是否可以在 C# 中扩展数组?

c# - WebApi v2 不接受文本/纯媒体类型