c# - C# 错误处理练习中的 throw 关键字负责什么

标签 c# exception error-handling try-catch throw

我正在尝试学习如何使用 VS2012 for Desktop 调试和处理 C# 代码中的错误。我正在使用 Step Into F11 技术单步执行以下代码。

我了解代码的执行如何在代码的不同部分之间跳转。我将消息打印到控制台以帮助我确定正在执行哪个步骤。我已经拆分了屏幕,这样我可以同时看到我正在进入哪一行代码以及控制台中的输出消息。

第 70 行(在注释中标记)- 当 nested index 被传递给 throwException() 我不明白为什么有一个 throw 关键字及其功能。为什么指针会跳转到嵌套的 finally block ,但随后会一直返回到 main 并抛出 IndexOutOfBounds 异常。这意味着什么?我看到代码中执行跳转的位置,但我不明白为什么它只是说 throw。这是否意味着已经处理了异常?但是如何呢?

我读到,当您throw 异常时,无需添加break; 语句,因为switch 语句在遇到throw 时中断> 关键字,但我不确定这是本例中的正确思路。

请帮助我理解第 70 行 throw 关键字的含义。

提前谢谢你。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Ch07Ex02
{
   class Program
   {
      static string[] eTypes = { "none", "simple", "index", "nested index" };

      static void Main(string[] args)
      {
         foreach (string eType in eTypes)
         {
            try
            {
               Console.WriteLine("Main() try block reached.");        // Line 19
               Console.WriteLine("ThrowException(\"{0}\") called.", eType);
               ThrowException(eType);
               Console.WriteLine("Main() try block continues.");      // Line 22
            }
            catch (System.IndexOutOfRangeException e)                 // Line 24
            {
               Console.WriteLine("Main() System.IndexOutOfRangeException catch"
                                 + " block reached. Message:\n\"{0}\"",
                                 e.Message);
            }
            catch                                                     // Line 30
            {
               Console.WriteLine("Main() general catch block reached.");
            }
            finally
            {
               Console.WriteLine("Main() finally block reached.");
            }
            Console.WriteLine();
         }
         Console.ReadKey();
      }

      static void ThrowException(string exceptionType)
      {
         Console.WriteLine("ThrowException(\"{0}\") reached.", exceptionType);
         switch (exceptionType)
         {
            case "none":
               Console.WriteLine("Not throwing an exception.");
               break;                                               // Line 50
            case "simple":
               Console.WriteLine("Throwing System.Exception.");
               throw new System.Exception();                        // Line 53
            case "index":
               Console.WriteLine("Throwing System.IndexOutOfRangeException.");
               eTypes[4] = "error";                                 // Line 56
               break;
            case "nested index":
               try                                                  // Line 59
               {
                  Console.WriteLine("ThrowException(\"nested index\") " +
                                    "try block reached.");
                  Console.WriteLine("ThrowException(\"index\") called.");
                  ThrowException("index");                          // Line 64
               }
               catch                                                // Line 66
               {
                  Console.WriteLine("ThrowException(\"nested index\") general"
                                    + " catch block reached.");
                  throw;                                            // Line 70 
               }
               finally
               {
                  Console.WriteLine("ThrowException(\"nested index\") finally"
                                    + " block reached.");
               }
               break;
         }
      }
   }
}

以上代码编译运行没有错误。

最佳答案

关键字 throw 可以在 catch 子句中单独使用,以重新抛出该 catch block 捕获的任何异常。它允许您在处理异常的过程中“插入”一些执行逻辑,而不会破坏抛出异常的细节。

在这种情况下,您可以将详细信息记录到控制台,然后重新抛出异常,就好像您从未处理过它一样。请注意,这不同于捕获异常并将其包装在您自己的异常中,因为保留了原始异常的详细信息。

关于c# - C# 错误处理练习中的 throw 关键字负责什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19226022/

相关文章:

c# - 带有额外泛型类型的奇怪的重复模板模式

java - ActionListener 事件处理

python - 循环时不离开

c# - 从外部站点记录错误

c# - 使用 TPL-Dataflow 进行聚合和连接(内部、外部、左侧...)?

c# - 使用非空构造函数初始化泛型

c# - 使用 C# 的条件 JSON 序列化

java - 初始化之前调用方法的正确 Java 异常类型

java - 用于权限异常的内置java异常类型

javascript - 对抛出错误的异步代码和同步代码进行基准测试