0Pricing
C# Academy · レッスン

カスタム例外とエラー設計

小さなカスタム例外を作成し、適切な組み込み型(ArgumentException、InvalidOperationException)を選び、InnerExceptionでコンテキストを追加します。

「カスタム例外とエラー設計」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これは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 を使用します。

よくある質問

「カスタム例外とエラー設計」レッスンは無料ですか?

はい。「カスタム例外とエラー設計」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。

「カスタム例外とエラー設計」で何を学びますか?

小さなカスタム例外を作成し、適切な組み込み型(ArgumentException、InvalidOperationException)を選び、InnerExceptionでコンテキストを追加します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。

「カスタム例外とエラー設計」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. try/catch/finally、throw newと再スロー
  2. カスタム例外とエラー設計
  3. IDisposableとusingステートメント
← C# Academyに戻る