0Pricing
C# Academy · 课时

try/catch/finally、throw new 与重新抛出

使用 try/catch/finally 实现可预测的错误处理;理解 throw new 与重新抛出的区别;让示例保持简短且重点明确。

try/catch/finally、throw new 与重新抛出 是 CoddyKit 上的免费 C# Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 3 节课。

异常概览

目标:安全地处理和传播错误。

  • try/catch:处理特定异常
  • finally:始终运行以执行清理
  • 比较 throw new 与重新抛出
  • 让处理程序保持简短;不要隐藏错误

捕获特定异常

捕获您预期的最具体异常;让处理程序保持简短清晰。

using System;

public class Program
{
  public static void Main(string[] args)
  {
    Console.WriteLine("Start");
    try
    {
      int x = 10;
      int y = 0; // will cause DivideByZeroException
      Console.WriteLine(x / y);
    }
    catch (DivideByZeroException ex)
    {
      Console.WriteLine("Cannot divide by zero: " + ex.GetType().Name);
    }
    Console.WriteLine("Continue");
  }
}

捕获顺序

顺序很重要:将具体的捕获块放在前面,并将通用的 Exception 捕获块放在最后作为安全保障。

using System;

public class Program
{
  static int ParseAndDivide(string text, int divisor)
  {
    // Throws FormatException or DivideByZeroException
    int value = int.Parse(text);
    return value / divisor;
  }

  public static void Main(string[] args)
  {
    try
    {
      Console.WriteLine(ParseAndDivide("not-a-number", 2));
    }
    catch (FormatException)
    {
      Console.WriteLine("Bad number format");
    }
    catch (Exception ex)
    {
      // Fallback last
      Console.WriteLine("Other error: " + ex.GetType().Name);
    }
  }
}

使用 finally 清理

将清理操作放入 finally。无论是否发生异常,它都会运行。

using System;

public class Program
{
  static bool opened = false;

  static void UseFakeResource()
  {
    try
    {
      opened = true;
      Console.WriteLine("Open");
      throw new InvalidOperationException("boom");
    }
    catch (InvalidOperationException)
    {
      Console.WriteLine("Handled");
    }
    finally
    {
      opened = false; // cleanup path
      Console.WriteLine("Close");
    }
  }

  public static void Main(string[] args)
  {
    UseFakeResource();
    Console.WriteLine("Opened? " + opened);
  }
}

正确地重新抛出异常

使用 throw; 重新抛出异常并保留原始堆栈。throw ex; 会重置堆栈。只有在需要添加上下文时,才使用新异常进行包装。

using System;

public class Program
{
  static void BadRethrow()
  {
    try
    {
      Fail();
    }
    catch (Exception ex)
    {
      // Resets stack trace:
      throw ex; // BAD rethrow
    }
  }

  static void GoodRethrow()
  {
    try
    {
      Fail();
    }
    catch
    {
      // Preserves original stack trace:
      throw; // GOOD rethrow
    }
  }

  static void Fail()
  {
    throw new InvalidOperationException("fail");
  }

  public static void Main(string[] args)
  {
    try { BadRethrow(); }
    catch (Exception ex)
    {
      Console.WriteLine("Bad: " + (ex.StackTrace == null ? "no stack" : "stack reset likely"));
    }

    try { GoodRethrow(); }
    catch (Exception ex)
    {
      Console.WriteLine("Good: preserves original stack");
    }
  }
}

处理指南

指南:

  • 只有在能够处理异常或添加上下文时才捕获。
  • 否则,让异常向上冒泡。
  • 让处理程序保持简短;避免悄悄吞掉异常。
  • 使用 finally 进行清理;资源释放将在下一课介绍。

重新抛出规则

快速检查:哪个语句可以在保留原始堆栈跟踪的同时正确地重新抛出当前异常?

总结

总结:使用 try/catch 处理具体错误,使用 finally 执行清理;重新抛出异常时,优先使用 throw; 以保留原始堆栈。

常见问题解答

「try/catch/finally、throw new 与重新抛出」课时是免费的吗?

是的 — 「try/catch/finally、throw new 与重新抛出」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 3 节课。

「try/catch/finally、throw new 与重新抛出」这节课中我会学到什么?

使用 try/catch/finally 实现可预测的错误处理;理解 throw new 与重新抛出的区别;让示例保持简短且重点明确。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「try/catch/finally、throw new 与重新抛出」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. try/catch/finally、throw new 与重新抛出
  2. 自定义异常与错误设计
  3. IDisposable 与 using 语句
← 返回 C# Academy