C# で複数の例外を一度にキャッチする: 代替方法
C# で複数の例外を一度にキャッチする
C# では、複数の例外を一度にキャッチすることが可能です。これは、複数の例外型を catch
ブロック内に列挙することで実現されます。
具体的な例
try
{
// 何かしらの処理
}
catch (ArgumentNullException ex)
{
// 引数が null の場合の処理
}
catch (InvalidOperationException ex)
{
// 無効な操作が行われた場合の処理
}
catch (Exception ex)
{
// その他の例外が発生した場合の処理
}
この例では、次の順序で例外がチェックされます:
ArgumentNullException
InvalidOperationException
Exception
最初のマッチした例外ブロックが実行されます。つまり、ArgumentNullException
が発生した場合、他のブロックは実行されません。
複数の例外を同じブロックでキャッチする
複数の例外を同じブロックでキャッチすることもできます。これには、|
演算子を使用して例外型を結合します。
try
{
// 何かしらの処理
}
catch (ArgumentNullException | InvalidOperationException ex)
{
// 引数が null または無効な操作が行われた場合の処理
}
catch (Exception ex)
{
// その他の例外が発生した場合の処理
}
この例では、ArgumentNullException
または InvalidOperationException
が発生した場合、同じブロックが実行されます。
注意点
- 例外の順序: 例外型は、より具体的なものからより一般的なものへと順序付けられます。
- 派生クラス: 派生クラスの例外は、基底クラスの例外の前にチェックされます。
Exception
は、すべての例外の基底クラスであるため、最後にチェックされます。
try
{
// 何かしらの処理
}
catch (ArgumentNullException ex)
{
// 引数が null の場合の処理
}
catch (InvalidOperationException ex)
{
// 無効な操作が行われた場合の処理
}
catch (Exception ex)
{
// その他の例外が発生した場合の処理
}
解説:
try
ブロック内に実行したいコードを記述します。catch
ブロックで、発生する可能性のある例外を指定します。- 複数の例外を一度にキャッチするには、複数の
catch
ブロックを使用し、各ブロックで異なる例外型を指定します。 - 最初にマッチした例外ブロックが実行されます。
try
{
// 何かしらの処理
}
catch (ArgumentNullException | InvalidOperationException ex)
{
// 引数が null または無効な操作が行われた場合の処理
}
catch (Exception ex)
{
// その他の例外が発生した場合の処理
}
|
演算子を使用して、複数の例外型を結合することができます。
例外処理のベストプラクティス
- 具体的な例外をキャッチする: 可能な限り、具体的な例外をキャッチするようにします。これにより、エラーの特定とデバッグが容易になります。
Exception
を最後にキャッチする:Exception
は、すべての例外の基底クラスであるため、最後にキャッチするようにします。これにより、他の例外がキャッチされないことを防ぎます。- 例外を適切に処理する: 例外が発生した場合、適切なエラーメッセージを表示したり、ログに記録したりするなどして、ユーザーに情報を提供します。
- 例外を再スローする: 必要に応じて、例外を再スローして、上位の呼び出し元に処理を委譲することができます。
when キーワードを使用する
when
キーワードを使用して、例外の条件を指定することができます。
try
{
// 何かしらの処理
}
catch (Exception ex) when (ex is ArgumentNullException || ex is InvalidOperationException)
{
// 引数が null または無効な操作が行われた場合の処理
}
catch (Exception ex)
{
// その他の例外が発生した場合の処理
}
パターンマッチングを使用する
C# 8 以降では、パターンマッチングを使用して、例外の型を検査することができます。
try
{
// 何かしらの処理
}
catch (Exception ex) when (ex is ArgumentNullException)
{
// 引数が null の場合の処理
}
catch (Exception ex) when (ex is InvalidOperationException)
{
// 無効な操作が行われた場合の処理
}
catch (Exception ex)
{
// その他の例外が発生した場合の処理
}
カスタム例外クラスを作成する
public class MyCustomException : Exception
{
// カスタム例外クラスの定義
}
try
{
// 何かしらの処理
}
catch (MyCustomException ex)
{
// カスタム例外が発生した場合の処理
}
catch (Exception ex)
{
// その他の例外が発生した場合の処理
}
フィルターブロックを使用する
C# 9 以降では、フィルターブロックを使用して、例外の条件を指定することができます。
try
{
// 何かしらの処理
}
catch (Exception ex) when (ex.Message.Contains("引数が null"))
{
// 引数が null の場合の処理
}
catch (Exception ex)
{
// その他の例外が発生した場合の処理
}
- 複数の例外を一度にキャッチする: 複数の
catch
ブロックを使用するか、when
キーワード、パターンマッチング、カスタム例外クラス、フィルターブロックを使用することができます。 - 具体的な例外をキャッチする: 可能な限り、具体的な例外をキャッチするようにします。
c# .net exception