※ この記事にはアフィリエイトリンクが含まれます
プログラムでエラーが起きて困っていませんか?
・エラーでアプリが突然止まってしまう
・どこで例外が起きたかわからない
・エラーを安全に処理する方法がわからない
結論から言うと、C#のtry catchを正しく使えば
エラーを安全に取り扱えます。
・try catchで例外を捕まえる
・catchでエラー内容に応じた処理をする
・finallyで後片付けをする
この記事では、C# try catch 使い方を
やさしく具体例付きで解説します。
なぜtry catchが必要なのか?
まず、プログラムは実行中に予期せぬ出来事が起こります。
例えばファイルが見つからない、ネットワークが切れるなどです。
何も対策をしないと、アプリは突然終了してしまいます。
これを防ぐために例外処理が必要です。
簡単なイメージ
tryは保険つきのとりあえずやってみる場所です。
問題が起きたらcatchが受け止めます。
最後に必ずやることがあればfinallyで処理します。
これがC#のtry catch finallyの基本イメージです。
基本の書き方(コード例)
まずは最も基本的な書き方です。
実際のコードで見てみましょう。
try
{
// ここに危ない処理を書く
int a = int.Parse("ABC");
}
catch (Exception ex)
{
// 例外が起きたときの処理
Console.WriteLine("エラー発生: " + ex.Message);
}
finally
{
// 必ず実行したい処理
Console.WriteLine("終了処理");
}
上の例ではint.Parseで変換できないと例外が出ます。catchでその例外を受け取り、警告を出します。
ポイント
- tryの中で例外が起きると、そこで処理は中断される
- catchは一番近いcatchが実行される
- finallyは例外の有無に関係なく必ず実行される
複数のcatchで種類ごとに処理を変える
例外は種類がいろいろあります。
ファイル系、ネットワーク系、変換系などです。
種類ごとに処理を変えるなら、複数のcatchを使います。
具体例を見てみましょう。
try
{
var text = File.ReadAllText("data.txt");
int num = int.Parse(text);
}
catch (FileNotFoundException fnf)
{
Console.WriteLine("ファイルが見つかりません: " + fnf.Message);
}
catch (FormatException fe)
{
Console.WriteLine("数字の形式が不正です: " + fe.Message);
}
catch (Exception ex)
{
Console.WriteLine("その他のエラー: " + ex.Message);
}
この書き方だと、何が原因かがわかりやすくなります。
実務ではログに書いたり、ユーザーに分かりやすいメッセージを出します。
よくある実務ケースと具体例
ここからはよくある現場のケースを紹介します。
実務での使い方がイメージしやすくなります。
1) ファイル読み込み(ユーザーがファイルを指定)
ユーザーがアップロードしたファイルを読む時に使います。
ファイルが無い、権限がない、といった問題が起きます。
try
{
var text = File.ReadAllText(userFilePath);
// 処理続行
}
catch (UnauthorizedAccessException uae)
{
// 権限エラーならユーザーに伝える
Console.WriteLine("ファイルにアクセスできません。権限を確認してください。");
}
catch (FileNotFoundException fnf)
{
Console.WriteLine("指定のファイルが見つかりませんでした。");
}
catch (Exception ex)
{
// 予期せぬエラーはログに残す
LogError(ex);
Console.WriteLine("エラーが発生しました。管理者に連絡してください。");
}
ポイントはユーザーに優しいメッセージと
管理者向けのログを分けることです。
2) データベース接続(ネットワークや接続失敗)
データベースに接続する処理は失敗しやすい場所です。
タイムアウトや認証エラーが起きます。
try
{
using (var conn = new SqlConnection(connString))
{
conn.Open();
// クエリ実行
}
}
catch (SqlException sqe)
{
// SQL関連のエラーは詳細をログ
LogError(sqe);
Console.WriteLine("データベースエラーが発生しました。");
}
catch (Exception ex)
{
LogError(ex);
Console.WriteLine("予期せぬエラーです。サポートに連絡してください。");
}
ここではusingを使ってリソースを自動で解放しています。finallyが不要な場合もありますが、catchでログは必須です。
3) 外部API呼び出し(タイムアウトやレスポンス不正)
外部サービスを呼ぶ時は必ず例外を想定します。
リトライやフォールバック処理を組むのが実務です。
try
{
var result = await httpClient.GetStringAsync(url);
}
catch (HttpRequestException hre)
{
// ネットワークエラーはリトライ候補
LogWarning(hre);
// 必要なら短い待ち時間の後リトライ
}
catch (Exception ex)
{
LogError(ex);
}
ネットワークは不安定なので、再試行や代替処理を用意します。
ユーザーにエラーを見せない工夫も大切です。
例外の再スロー(rethrow)の違い
catchの中で例外をそのまま投げ直すことがあります。
ここで2つの書き方の違いを説明します。
// そのまま再スロー(元のスタックトレースを保つ)
catch (Exception)
{
throw;
}
// 新しい例外として投げる(スタックトレースが変わる)
catch (Exception ex)
{
throw new Exception("処理中にエラー", ex);
}
元の情報を残したい場合はthrowだけを使います。
追加情報を付けたい場合は新しい例外を作りますが、注意が必要です。
よくある間違いとベストプラクティス
初心者がよくするミスを避けるコツをまとめます。
簡単に覚えられるポイントです。
catchで何もしない(空のcatch)は避ける
ログや代替処理を必ず行うか再スローする- すべての例外を
catch (Exception)で受けるのは慎重に
特定の例外を先に書く - エラー処理と通常処理を混ぜすぎない
読みやすく保守しやすいコードにする - ユーザーには優しいメッセージを出す
機密情報(スタックトレース等)は見せない - ログは必ず残す
原因調査がしやすくなる
実務で使う便利なテクニック
現場で役に立つ、ちょっとした工夫を紹介します。
すぐに使えるテクニックです。
ログに例外の詳細を残す
例外のMessageだけでなくStackTraceも残すと原因が早くわかります。
日時や処理名も一緒にログにすると便利です。
特定の例外だけをcatchする
必要な種類だけcatchして、予期せぬ例外は上位に投げる方が安全です。
これによりバグの見逃しを減らせます。
リトライやフォールバックを用意する
外部依存がある処理は失敗する可能性が高いです。
短いリトライか、別の方法で処理を進めると良いです。
まとめ
C# try catch 使い方のポイントを整理します。
初心者でも実務で使えるようにまとめました。
・tryで危ない処理を囲む
・catchで例外ごとに処理を分ける
・finallyで後片付けを必ず行う
・ログは必ず残す
・catchは無意味に空にしない
・外部処理はリトライや代替を考える
この記事の例を元に、まずは小さなコードで
try catchを試してみてください。
エラーに強いプログラムが作れるようになります。

#エンジニアとして、もっと自分の力を活かしたいあなたへ
「このまま今の職場にいて、成長できるんだろうか?」
C#を使っている方なら、一度はそう感じたことがあるかもしれません。
実は今、C#/.NETエンジニアの市場価値は高まっており、
年収アップ・フルリモート・自社開発企業など、選べる選択肢は確実に増えています。
もし今後、C#を活かして働きたい、あるいは開発現場で経験を積みたいとお考えなら…
自分に合った転職サービスを早めに知っておくことが大きな武器になります。
現役エンジニアからのサポート付き・無料で学べるスクール・社内SE特化の求人など、
転職支援サービスを厳選したまとめ記事をこちらで紹介しています。

ここまで読んでいただきありがとうございました。
コメント