0Pricing
C# Academy · Pelajaran

Pengecualian khusus; perancangan kesalahan

Buat pengecualian khusus yang sederhana, pilih tipe bawaan yang tepat (ArgumentException, InvalidOperationException), dan tambahkan konteks dengan InnerException.

Pengecualian khusus; perancangan kesalahan adalah pelajaran C# Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 3. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C# Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C# Academy mencakup 3 pelajaran total.

Tujuan & sasaran

Tujuan: Buat kesalahan menjadi jelas dan dapat ditangkap.

  • Gunakan jenis yang spesifik untuk kegagalan tertentu
  • Pesan yang baik + InnerException untuk konteks
  • Utamakan jenis bawaan jika sesuai

Jenis pengecualian kustom

Turunkan dari Exception, akhiri namanya dengan Exception, dan tambahkan konstruktor standar. Sertakan data kecil yang berguna.

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 untuk konteks

Bungkus pengecualian tingkat rendah dengan pengecualian domain dan set InnerException untuk mempertahankan penyebab utama.

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);
    }
  }
}

Pilih jenis bawaan terlebih dahulu

Gunakan jenis bawaan untuk masalah umum: ArgumentNullException, ArgumentOutOfRangeException, FormatException, InvalidOperationException, dan sebagainya.

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); }
  }
}

Pengecualian vs pemeriksaan

Gunakan pengecualian untuk situasi yang tidak biasa. Untuk kegagalan yang diharapkan, utamakan pemeriksaan TryX atau kode pengembalian.

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");
  }
}

Daftar periksa desain kesalahan

Daftar periksa:

  • Pilih jenis bawaan jika memungkinkan.
  • Jika tidak, buat CustomException kecil dengan konstruktor standar.
  • Tambahkan InnerException untuk mempertahankan penyebab utama.
  • Gunakan pengecualian untuk kasus yang tidak terduga; gunakan TryX untuk kegagalan yang diharapkan.

Desain pengecualian kustom

Pemeriksaan singkat: Apa desain yang disarankan untuk jenis pengecualian kustom dalam C#?

Ringkasan

Ringkasan: Utamakan pengecualian bawaan; jika tidak, definisikan jenis kustom kecil dengan konstruktor standar dan gunakan InnerException untuk menambahkan konteks tanpa kehilangan penyebabnya.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Pengecualian khusus; perancangan kesalahan” gratis?

Ya — teks lengkap “Pengecualian khusus; perancangan kesalahan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C# Academy, upgrade ke CoddyKit PRO. Kursus C# Academy mencakup 3 pelajaran total.

Apa yang akan aku pelajari di “Pengecualian khusus; perancangan kesalahan”?

Buat pengecualian khusus yang sederhana, pilih tipe bawaan yang tepat (ArgumentException, InvalidOperationException), dan tambahkan konteks dengan InnerException. Kamu berlatih C# Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai C# Academy?

Tidak diperlukan pengalaman sebelumnya. C# Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 3.

Berapa lama pelajaran “Pengecualian khusus; perancangan kesalahan” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran C# Academy ini?

Ya. Setiap pelajaran C# Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. try/catch/finally, throw new vs lempar ulang
  2. Pengecualian khusus; perancangan kesalahan
  3. IDisposable, pernyataan using
← Kembali ke C# Academy