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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- try/catch/finally、throw newと再スロー
- カスタム例外とエラー設計
- IDisposableとusingステートメント