0Pricing
C# Academy · บทเรียน

ข้อยกเว้นแบบกำหนดเองและการออกแบบข้อผิดพลาด

สร้างข้อยกเว้นแบบกำหนดเองขนาดเล็ก เลือกชนิดในตัวที่ถูกต้อง (ArgumentException, InvalidOperationException) และเพิ่มบริบทด้วย InnerException

ข้อยกเว้นแบบกำหนดเองและการออกแบบข้อผิดพลาด เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

วัตถุประสงค์และเป้าหมาย

จุดมุ่งหมาย: ทำให้ข้อผิดพลาดชัดเจนและสามารถจับได้

  • ใช้ชนิดที่เฉพาะเจาะจงสำหรับความล้มเหลวแต่ละแบบ
  • ใช้ข้อความที่ดีและ InnerException เพื่อให้มีบริบท
  • เลือกใช้ชนิดที่มีมาให้ในระบบเมื่อเหมาะสม

ชนิดข้อยกเว้นแบบกำหนดเอง

สืบทอดจาก Exception ลงท้ายชื่อด้วย Exception และเพิ่มตัวสร้างมาตรฐาน เก็บข้อมูลขนาดเล็กที่เป็นประโยชน์

using System;

// Custom, specific to our domain
public sealed class ConfigNotFoundException : Exception
{
  public string Key { get; private set; }

  public ConfigNotFoundException(string key)
    : base("Config key not found: " + key)
  {
    Key = key;
  }

  public ConfigNotFoundException(string key, Exception inner)
    : base("Config key not found: " + key, inner)
  {
    Key = key;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      throw new ConfigNotFoundException("ApiUrl");
    }
    catch (ConfigNotFoundException ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

InnerException เพื่อให้มีบริบท

ห่อข้อยกเว้นระดับล่างด้วยข้อยกเว้นของโดเมน และกำหนด InnerException เพื่อรักษาสาเหตุที่แท้จริงไว้

using System;
using System.IO;

public sealed class ConfigNotFoundException : Exception
{
  public string Key { get; private set; }
  public ConfigNotFoundException(string key, Exception inner)
    : base("Config key not found: " + key, inner) { Key = key; }
}

public static class Config
{
  public static string Load(string path, string key)
  {
    try
    {
      string[] lines = File.ReadAllLines(path); // may throw
      for (int i = 0; i < lines.Length; i++)
      {
        int idx = lines[i].IndexOf("=");
        if (idx > 0 && lines[i].Substring(0, idx) == key)
          return lines[i].Substring(idx + 1);
      }
      throw new ConfigNotFoundException(key, null);
    }
    catch (IOException io)
    {
      // Wrap low-level error with domain meaning
      throw new ConfigNotFoundException(key, io);
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      Console.WriteLine(Config.Load("missing.cfg", "ApiUrl"));
    }
    catch (ConfigNotFoundException ex)
    {
      Console.WriteLine("Top: " + ex.Message);
      if (ex.InnerException != null)
        Console.WriteLine("Inner: " + ex.InnerException.GetType().Name);
    }
  }
}

เลือกชนิดที่มีมาให้ในระบบก่อน

ใช้ชนิดที่มีมาให้ในระบบสำหรับปัญหาทั่วไป: ArgumentNullException, ArgumentOutOfRangeException, FormatException, InvalidOperationException และอื่น ๆ

using System;

public static class MathUtil
{
  public static int Divide(int a, int b)
  {
    if (b == 0) throw new DivideByZeroException();
    return a / b;
  }

  public static int ParsePositive(string text)
  {
    if (text == null) throw new ArgumentNullException("text");
    int value = int.Parse(text); // may throw FormatException
    if (value <= 0) throw new ArgumentOutOfRangeException("text", "must be > 0");
    return value;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try { Console.WriteLine(MathUtil.ParsePositive("-1")); }
    catch (ArgumentOutOfRangeException ex) { Console.WriteLine("Range: " + ex.ParamName); }
  }
}

ข้อยกเว้นกับการตรวจสอบ

ใช้ข้อยกเว้นสำหรับสถานการณ์ที่ผิดปกติ สำหรับความล้มเหลวที่คาดไว้ ให้เลือกการตรวจสอบแบบ TryX หรือรหัสผลลัพธ์

using System;

public static class Parser
{
  // BAD: using exceptions for expected cases
  public static int ParseOrThrow(string s)
  {
    return int.Parse(s); // will throw often for user input
  }

  // GOOD: guard-check pattern for expected failure
  public static bool TryParsePositive(string s, out int value)
  {
    value = 0;
    int tmp;
    if (!int.TryParse(s, out tmp)) return false;
    if (tmp <= 0) return false;
    value = tmp;
    return true;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    int v;
    if (Parser.TryParsePositive("12", out v))
      Console.WriteLine("OK " + v);
    else
      Console.WriteLine("Invalid");
  }
}

รายการตรวจสอบการออกแบบข้อผิดพลาด

รายการตรวจสอบ:

  • เลือกชนิดที่มีมาให้ในระบบเมื่อทำได้
  • หากทำไม่ได้ ให้สร้าง CustomException ขนาดเล็กพร้อมตัวสร้างมาตรฐาน
  • แนบ InnerException เพื่อรักษาสาเหตุที่แท้จริงไว้
  • ใช้ข้อยกเว้นสำหรับกรณีที่ไม่คาดคิด และใช้ TryX สำหรับความล้มเหลวที่คาดไว้

การออกแบบข้อยกเว้นแบบกำหนดเอง

ตรวจสอบอย่างรวดเร็ว: แนวทางที่แนะนำสำหรับออกแบบชนิดข้อยกเว้นแบบกำหนดเองใน C# คืออะไร

ทบทวน

ทบทวน: เลือกใช้ข้อยกเว้นที่มีมาให้ในระบบก่อน หากไม่เหมาะสม ให้กำหนดชนิดแบบกำหนดเองขนาดเล็กพร้อมตัวสร้างมาตรฐาน และใช้ InnerException เพื่อเพิ่มบริบทโดยไม่สูญเสียสาเหตุเดิม

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

บทเรียน “ข้อยกเว้นแบบกำหนดเองและการออกแบบข้อผิดพลาด” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ข้อยกเว้นแบบกำหนดเองและการออกแบบข้อผิดพลาด”

สร้างข้อยกเว้นแบบกำหนดเองขนาดเล็ก เลือกชนิดในตัวที่ถูกต้อง (ArgumentException, InvalidOperationException) และเพิ่มบริบทด้วย InnerException คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “ข้อยกเว้นแบบกำหนดเองและการออกแบบข้อผิดพลาด” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. try/catch/finally, throw new เทียบกับการโยนซ้ำ
  2. ข้อยกเว้นแบบกำหนดเองและการออกแบบข้อผิดพลาด
  3. IDisposable และคำสั่ง using
← กลับไปที่ C# Academy