#11 C#で学ぶエラーハンドリングの基本

C#のエラーハンドリングは、Javaとよく似たtry・catchの仕組みを使います。この記事では、C#におけるエラーハンドリングの基本と、独自の構文を解説します。

try・catchの基本

try {
    int result = 10 / 0;
} catch (DivideByZeroException e) {
    Console.WriteLine("0では割れません");
}

複数の例外を扱う

try {
    // 何らかの処理
} catch (DivideByZeroException e) {
    Console.WriteLine("計算エラー");
} catch (Exception e) {
    Console.WriteLine("その他のエラー: " + e.Message);
}

複数のcatchを並べる場合、より具体的な例外の種類を先に、汎用的なExceptionを後に書くのが基本です。

finallyという必ず実行される部分

try {
    // 何らかの処理
} finally {
    Console.WriteLine("処理が終わりました");
}

finallyブロックは、例外が起きても起きなくても必ず実行されるため、ファイルを閉じる、接続を切断するといった後片付けの処理を書くのに適しています。

独自の例外を投げる

自分でエラー状態を作り出したい場合はthrowを使います。

void SetAge(int age) {
    if (age < 0) {
        throw new ArgumentException("年齢は0以上である必要があります");
    }
}

既存の例外クラスで意味が合わない場合は、Exceptionを継承した独自の例外クラスを定義することもできます。

usingステートメントで後片付けを自動化する

ファイルやデータベース接続など、使い終わったら必ず解放する必要があるリソースには、usingステートメントを使うと、finallyを自分で書かなくても自動的に解放処理が呼ばれます。

using (var reader = new StreamReader("data.txt")) {
    string content = reader.ReadToEnd();
}
// このブロックを抜けると自動的にreaderが閉じられる

C#ならではの注意点

Javaにはあった「チェック例外」(あらかじめ宣言が必要な例外)の仕組みが、C#にはありません。どんな例外が発生しうるかは、ドキュメントを読むか実際に試してみるまで分からないことがあるため、外部のライブラリを使う際は、公式ドキュメントで発生しうる例外を確認する習慣をつけましょう。また、catch (Exception e) { }のようにすべての例外を握りつぶして何もしないコードは、バグの発見を遅らせる原因になるため避け、少なくともログに記録するようにしましょう。

まとめ

C#のエラーハンドリングはtry・catch・finallyが基本で、throwで独自の例外を発生させられます。Javaと違いチェック例外がない分、ドキュメントの確認が重要になります。


本ページはプロモーションを含みます。

参考書籍(PR)

C#をもっと学びたい方には「確かな力が身につくC#「超」入門 第2版」がおすすめです。


PR

コードを書かずに自動化したい方へ

「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本