0Pricing
C# Academy · レッスン

try/catch/finally、throw newと再スロー

予測可能なエラー処理にtry/catch/finallyを使い、throw newと再スローの違いを理解します。例は小さく、要点を絞ります。

「try/catch/finally、throw newと再スロー」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応の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");
  }
}

catch の順序

順序が重要です。具体的な catch を先に置き、安全網としての汎用的な Exception catch を最後に置きます。

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

「try/catch/finally、throw newと再スロー」で何を学びますか?

予測可能なエラー処理にtry/catch/finallyを使い、throw newと再スローの違いを理解します。例は小さく、要点を絞ります。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応の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に戻る