C# Academy · บทเรียน

try/catch/finally, throw new เทียบกับการโยนซ้ำ

ใช้ try/catch/finally เพื่อจัดการข้อผิดพลาดอย่างคาดเดาได้ ทำความเข้าใจ throw new เทียบกับการโยนซ้ำ และรักษาตัวอย่างให้สั้นและตรงประเด็น

บทเรียน 1 จาก 38 ขั้นตอน

try/catch/finally, throw new เทียบกับการโยนซ้ำ เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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; เมื่อโยนข้อยกเว้นซ้ำเพื่อคงสแต็กเดิมไว้

เริ่มต้นได้ฟรี

เรียนรู้ C# ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
93
บทเรียน
346

คำถามที่พบบ่อย

บทเรียน “try/catch/finally, throw new เทียบกับการโยนซ้ำ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “try/catch/finally, throw new เทียบกับการโยนซ้ำ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “try/catch/finally, throw new เทียบกับการโยนซ้ำ”

ใช้ try/catch/finally เพื่อจัดการข้อผิดพลาดอย่างคาดเดาได้ ทำความเข้าใจ throw new เทียบกับการโยนซ้ำ และรักษาตัวอย่างให้สั้นและตรงประเด็น คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 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