C#は例外をtry/catch/finallyでキャッチしてエラーを処理します。適切な例外処理とは、特定の例外型をキャッチし、リソースをクリーンアップし(しばしばusingで行う)、意味のあるカスタム例外を作成し、エラーを暗黙に無視しないことです。
C#は例外をtry/catch/finallyでキャッチしてエラーを処理します。適切な例外処理とは、特定の例外型をキャッチし、リソースをクリーンアップし(しばしばusingで行う)、意味のあるカスタム例外を作成し、エラーを暗黙に無視しないことです。
try
{
var data = RiskyOperation();
}
catch (FileNotFoundException ex) // catch SPECIFIC types (most specific first)
{
Console.WriteLine($"File missing: {ex.Message}");
}
catch (IOException ex)
{
Log(ex);
throw; // re-throw, PRESERVING the stack trace (not `throw ex`)
}
catch (Exception ex) // catch-all (last) — base of all exceptions
{
Log(ex);
}
finally
{
Cleanup(); // ALWAYS runs (success, exception, or return)
}
特定の例外型を最初にキャッチし、Exceptionを最後のキャッチオールとして使用し、必ず実行する必要があるクリーンアップにはfinallyを使用します。**重要:**再スローする場合はthrow;(throw ex;ではなく)を使用してください。元のスタックトレースが保持されます。
if (amount < 0)
throw new ArgumentException("Amount must be positive", nameof(amount));
// a custom exception for your domain
public class InsufficientFundsException : Exception
{
public InsufficientFundsException(string message) : base(message) { }
}
throw new InsufficientFundsException("Balance too low");
// `using` guarantees Dispose() is called (close files/connections) even on exception
using (var file = new StreamReader("data.txt"))
{
var content = file.ReadToEnd();
} // file.Dispose() called automatically here
using var conn = new SqlConnection(...); // C# 8 simplified form
usingステートメントは、IDisposableリソース(ファイル、接続)が適切に破棄されることを保証します。手動のfinallyよりも、リソースクリーンアップの推奨方法です。
catch (Exception ex) when (ex.Message.Contains("timeout")) // exception filter (when)
{ ... }
✓ Catch SPECIFIC exceptions, not just Exception
✓ Use `using` for IDisposable resources (reliable cleanup)
✓ Don't swallow exceptions silently (empty catch) — log or re-throw
✓ Use `throw;` (not `throw ex;`) to preserve the stack trace
✓ Create meaningful custom exceptions; don't use exceptions for normal control flow
適切な例外処理は、堅牢で信頼性の高いC#アプリケーションを構築するのに不可欠であり、それを十分に理解することが重要です。
try/catch/finally構造、特定の例外型をキャッチ(対象を絞った処理のため)しExceptionを最後のキャッチオールとして使用し、保証されたクリーンアップのためにfinallyを使用することが基本です。
いくつかのC#固有のベストプラクティスが特に重要です:再スロー時に**throw ex;ではなくthrow;を使用すること(微妙だが重要な詳細です。throw ex;はスタックトレースをリセットし、貴重なデバッグ情報を失います)、IDisposableリソースに対してusingステートメント**を使用すること(ファイル、接続、その他のリソースが例外が発生した場合でも適切にクリーンアップされることを保証する推奨で信頼性の高い方法です。手動finallyブロックより堅牢であり、C#のリソース管理モデルの中核です)、そして例外を暗黙に無視しないことです。
例外処理の理解、構造、特定のキャッチ、カスタム例外、スタックトレースを保持する再スロー、特にリソースクリーンアップのためのusingは、エラーを適切に処理し、リソースを正しく管理する信頼性の高いC#を書くために重要です。
ハンドルされない例外とリソースリークは現実的な信頼性の問題を引き起こすため、またC#には堅牢なコードと脆弱なコードを区別する固有のイディオム(usingパターン、throw;による保持)があるため、例外処理をマスターすることは、専門的なC#開発のための重要で頻繁に適用される知識です。