第15章 例外処理
この章の目的
Section titled “この章の目的”この章では、プログラムの実行中に発生するエラーに対応するための 例外処理 を学習します。
これまでの章では、次のようなコードを何度も使ってきました。
string input = Console.ReadLine() ?? "";int number = int.Parse(input);このコードは、正しく数値が入力されれば問題なく動作します。
しかし、次のように数値ではない文字が入力されたらどうなるでしょうか。
abcこの場合、int.Parse は文字列を整数に変換できないため、プログラムの実行中にエラーが発生します。
また、ファイルを読み込むプログラムでは、次のような問題が起きることもあります。
ファイルが存在しないファイルを開く権限がない他のアプリがファイルを使用中後の章では、Oracle Databaseへ接続します。
その場合も、次のような問題が起きる可能性があります。
DBに接続できないユーザー名やパスワードが間違っているSQL文が間違っている取得したデータが想定と違うこのような実行中の問題に対応するために使うのが 例外処理 です。
この章では、まず次のことを目標にします。
例外とは何かを知るtry-catch の基本形を使える例外が発生してもプログラムを終了させずに対応できる例外の種類を見分けられるfinally の役割を理解する入力エラーやファイル操作エラーに対応できるこの章でできるようになること
Section titled “この章でできるようになること”この章を終えると、次のことができるようになります。
- 例外とは何かを説明できる
- 実行時エラーとコンパイルエラーの違いをおおまかに説明できる
try-catchの基本形を書けるFormatExceptionを使って数値変換エラーに対応できるExceptionオブジェクトからエラーメッセージを取得できる- 複数の
catchを使って例外の種類ごとに処理を分けられる finallyの役割を説明できるint.TryParseを使って安全に数値入力を処理できるthrowを使って自分で例外を発生させられる- ファイル操作で発生する例外に対応できる
- DB接続やWebアプリで例外処理が重要になる理由を説明できる
本章で使用する環境
Section titled “本章で使用する環境”| 項目 | 内容 |
|---|---|
| 開発環境 | Visual Studio 2022 |
| プロジェクト種類 | コンソール アプリ |
| 対象フレームワーク | .NET 8 |
| プロジェクト名 | Chapter15_ExceptionHandling |
作業前チェック
Section titled “作業前チェック”作業を始める前に、次の内容を確認してください。
-
Console.ReadLineで入力を受け取れる -
int.Parseで文字列を数値に変換できる -
if文で条件分岐できる -
while文で再入力処理を書ける - メソッドを作成できる
- ファイルの読み書きの基本を理解している
- 第14章の内容をGitに提出済みである
15-1 例外とは?
Section titled “15-1 例外とは?”コンパイルエラーと実行時エラー
Section titled “コンパイルエラーと実行時エラー”プログラムのエラーには、大きく分けて次のようなものがあります。
コンパイルエラー 実行前に発見されるエラー
実行時エラー 実行中に発生するエラーコンパイルエラーの例:
Console.WriteLine("こんにちは")このコードは、最後の ; がありません。
そのため、Visual Studio上でエラーが表示され、実行する前に問題に気づけます。
一方、次のコードはコンパイルは通ります。
string input = Console.ReadLine() ?? "";int number = int.Parse(input);しかし、実行時に abc のような文字列を入力すると、整数に変換できずエラーになります。
このように、実行中に発生する問題を 例外 と呼びます。
例外が発生するコード
Section titled “例外が発生するコード”次のコードを入力して実行してください。
using System;
class Program{ static void Main() { Console.WriteLine("整数を入力してください。");
string input = Console.ReadLine() ?? ""; int number = int.Parse(input);
Console.WriteLine($"入力された数値:{number}"); }}実行例:
整数を入力してください。abcこの場合、abc は整数に変換できないため、例外が発生します。
Visual Studioで実行している場合、例外が発生した行で停止することがあります。
FormatException
Section titled “FormatException”int.Parse で数値に変換できない文字列を渡すと、FormatException が発生します。
FormatException 入力文字列の形式が正しくない場合に発生する例外たとえば、次のような入力は整数に変換できません。
abc12.5一二三空文字このような場合に、プログラムがそのまま終了しないようにするため、例外処理を使います。
15-2 try-catch文
Section titled “15-2 try-catch文”try-catchの基本形
Section titled “try-catchの基本形”例外処理の基本形は、try-catch です。
try{ 例外が発生する可能性がある処理}catch{ 例外が発生したときの処理}try ブロックの中で例外が発生すると、catch ブロックに処理が移ります。
数値変換エラーに対応する
Section titled “数値変換エラーに対応する”次のコードを入力して実行してください。
using System;
class Program{ static void Main() { Console.WriteLine("整数を入力してください。");
string input = Console.ReadLine() ?? "";
try { int number = int.Parse(input); Console.WriteLine($"入力された数値:{number}"); } catch { Console.WriteLine("整数に変換できませんでした。"); }
Console.WriteLine("処理を終了します。"); }}実行例:
整数を入力してください。abc整数に変換できませんでした。処理を終了します。例外は発生していますが、catch によって処理されているため、プログラム全体が途中で強制終了せずに済みます。
正常に変換できた場合
Section titled “正常に変換できた場合”数値を入力した場合は、catch は実行されません。
実行例:
整数を入力してください。123入力された数値:123処理を終了します。この場合、try ブロックの中の処理が正常に最後まで実行されます。
catchで例外情報を受け取る
Section titled “catchで例外情報を受け取る”catch では、例外に関する情報を受け取れます。
catch (Exception ex){ Console.WriteLine(ex.Message);}ex.Message には、例外の内容を表すメッセージが入っています。
using System;
class Program{ static void Main() { Console.WriteLine("整数を入力してください。");
string input = Console.ReadLine() ?? "";
try { int number = int.Parse(input); Console.WriteLine($"入力された数値:{number}"); } catch (Exception ex) { Console.WriteLine("エラーが発生しました。"); Console.WriteLine(ex.Message); }
Console.WriteLine("処理を終了します。"); }}実行例:
整数を入力してください。abcエラーが発生しました。The input string 'abc' was not in a correct format.処理を終了します。環境によって、メッセージの表示内容は多少異なる場合があります。
Exceptionとは
Section titled “Exceptionとは”Exception は、例外を表す基本的なクラスです。
多くの例外は、Exception をもとにしたクラスとして用意されています。
代表的な例は次の通りです。
| 例外クラス | 主な発生例 |
|---|---|
FormatException | 数値変換に失敗した |
DivideByZeroException | 0で割ろうとした |
FileNotFoundException | ファイルが見つからない |
IOException | ファイル操作で問題が起きた |
InvalidOperationException | 操作できない状態で処理を行った |
この章では、すべてを覚える必要はありません。
まずは、例外には種類があり、catch で受け取って対応できることを理解しましょう。
15-3 複数のcatchを使う
Section titled “15-3 複数のcatchを使う”例外の種類ごとに処理を分ける
Section titled “例外の種類ごとに処理を分ける”catch は複数書くことができます。
try{ 処理}catch (FormatException){ 数値変換エラーの場合の処理}catch (Exception){ その他のエラーの場合の処理}例外の種類ごとにメッセージを変えたい場合などに使います。
FormatExceptionを指定する
Section titled “FormatExceptionを指定する”using System;
class Program{ static void Main() { Console.WriteLine("整数を入力してください。");
string input = Console.ReadLine() ?? "";
try { int number = int.Parse(input); Console.WriteLine($"入力された数値:{number}"); } catch (FormatException) { Console.WriteLine("整数として正しい形式で入力してください。"); } catch (Exception ex) { Console.WriteLine("予期しないエラーが発生しました。"); Console.WriteLine(ex.Message); } }}実行例:
整数を入力してください。abc整数として正しい形式で入力してください。FormatException が発生した場合は、最初の catch が実行されます。
0で割るエラー
Section titled “0で割るエラー”次のコードでは、割り算を行います。
using System;
class Program{ static void Main() { Console.WriteLine("割られる数を入力してください。"); int number1 = int.Parse(Console.ReadLine() ?? "");
Console.WriteLine("割る数を入力してください。"); int number2 = int.Parse(Console.ReadLine() ?? "");
try { int result = number1 / number2; Console.WriteLine($"計算結果:{result}"); } catch (DivideByZeroException) { Console.WriteLine("0で割ることはできません。"); } }}実行例:
割られる数を入力してください。10割る数を入力してください。00で割ることはできません。0で整数の割り算を行うと、DivideByZeroException が発生します。
catchの順番に注意する
Section titled “catchの順番に注意する”複数の catch を書く場合、具体的な例外を先に書きます。
正しい例:
catch (FormatException){ Console.WriteLine("形式が正しくありません。");}catch (Exception){ Console.WriteLine("その他のエラーです。");}Exception は多くの例外を受け取れるため、先に書いてしまうと、後ろの具体的な catch に到達しません。
そのため、次のような順番は避けます。
catch (Exception){ Console.WriteLine("その他のエラーです。");}catch (FormatException){ Console.WriteLine("形式が正しくありません。");}このように書くと、FormatException の catch が実行される機会がなくなってしまいます。
15-4 finally文
Section titled “15-4 finally文”finallyとは
Section titled “finallyとは”finally は、例外が発生してもしなくても、最後に必ず実行したい処理を書くために使います。
try{ 例外が発生する可能性がある処理}catch{ 例外が発生したときの処理}finally{ 最後に必ず実行したい処理}たとえば、次のような処理に使われます。
ファイルを閉じるDB接続を閉じる後片付けをするログを出力するfinallyの動きを確認する
Section titled “finallyの動きを確認する”using System;
class Program{ static void Main() { Console.WriteLine("整数を入力してください。");
string input = Console.ReadLine() ?? "";
try { int number = int.Parse(input); Console.WriteLine($"入力された数値:{number}"); } catch (FormatException) { Console.WriteLine("整数として正しい形式で入力してください。"); } finally { Console.WriteLine("finallyの処理です。"); }
Console.WriteLine("プログラムを終了します。"); }}数値を入力した場合:
整数を入力してください。123入力された数値:123finallyの処理です。プログラムを終了します。数値以外を入力した場合:
整数を入力してください。abc整数として正しい形式で入力してください。finallyの処理です。プログラムを終了します。どちらの場合でも、finally の処理は実行されます。
DB接続との関係
Section titled “DB接続との関係”後の章では、Oracle Databaseへ接続します。
DB接続では、接続を開いたら、使い終わった後に閉じる必要があります。
DBに接続するSQLを実行する結果を読み取るDB接続を閉じる例外が発生した場合でも、DB接続を開いたままにしないようにする必要があります。
そのため、例外が発生してもしなくても実行される finally は重要です。
ただし、実際のC#では、後の章で扱う using 文を使って、接続を自動的に閉じる書き方もよく使います。
この章では、まず finally の役割を理解しておきましょう。
15-5 TryParseを使った入力チェック
Section titled “15-5 TryParseを使った入力チェック”例外を使わずに変換できるか確認する
Section titled “例外を使わずに変換できるか確認する”数値入力では、int.Parse と try-catch を組み合わせる方法もあります。
しかし、入力チェックでは int.TryParse を使うことも多いです。
TryParse は、変換に成功したかどうかを true / false で返します。
bool success = int.TryParse(input, out number);TryParseの基本
Section titled “TryParseの基本”using System;
class Program{ static void Main() { Console.WriteLine("整数を入力してください。");
string input = Console.ReadLine() ?? "";
int number;
bool success = int.TryParse(input, out number);
if (success) { Console.WriteLine($"入力された数値:{number}"); } else { Console.WriteLine("整数として正しい形式で入力してください。"); } }}実行例:
整数を入力してください。123入力された数値:123実行例:
整数を入力してください。abc整数として正しい形式で入力してください。TryParse を使うと、変換に失敗しても例外は発生しません。
次の部分に注目してください。
int.TryParse(input, out number)out number は、変換に成功した場合に、変換後の数値を number に入れるための書き方です。
inputを整数に変換できた ↓numberに変換後の値が入る ↓trueが返る
inputを整数に変換できなかった ↓numberには有効な入力値は入らない ↓falseが返るこの章では、まず次のように理解してください。
TryParse → 変換できるか試す
out → 変換できた値を受け取る正しい数値が入力されるまで繰り返す
Section titled “正しい数値が入力されるまで繰り返す”TryParse と while を組み合わせると、正しい数値が入力されるまで再入力させることができます。
using System;
class Program{ static void Main() { int number;
while (true) { Console.WriteLine("整数を入力してください。");
string input = Console.ReadLine() ?? "";
if (int.TryParse(input, out number)) { break; }
Console.WriteLine("整数として正しい形式で入力してください。"); }
Console.WriteLine($"入力された数値:{number}"); }}実行例:
整数を入力してください。abc整数として正しい形式で入力してください。整数を入力してください。123入力された数値:123入力チェックでは、try-catch よりも TryParse の方が自然な場合もあります。
ParseとTryParseの使い分け
Section titled “ParseとTryParseの使い分け”| 方法 | 特徴 | 向いている場面 |
|---|---|---|
int.Parse | 変換できないと例外が発生する | 入力が正しい前提の場合 |
int.TryParse | 変換できるか確認できる | ユーザー入力を安全に処理する場合 |
コンソールアプリや画面アプリでユーザー入力を扱う場合、TryParse は非常によく使います。
15-6 自分で例外を発生させる
Section titled “15-6 自分で例外を発生させる”throwとは
Section titled “throwとは”プログラムの中で、あえて例外を発生させたい場合があります。
たとえば、商品価格にマイナス値が指定された場合、プログラムとして不正な値だと判断できます。
このような場合に throw を使います。
throw new Exception("エラーメッセージ");商品価格をチェックする
Section titled “商品価格をチェックする”using System;
class Program{ static void Main() { try { Product product = new Product("ノート", -100);
Console.WriteLine(product.GetDisplayText()); } catch (Exception ex) { Console.WriteLine("エラーが発生しました。"); Console.WriteLine(ex.Message); } }}
class Product{ public string ProductName { get; private set; } public int Price { get; private set; }
public Product(string productName, int price) { if (price < 0) { throw new Exception("価格にマイナス値は指定できません。"); }
ProductName = productName; Price = price; }
public string GetDisplayText() { return $"{ProductName}:{Price}円"; }}実行結果:
エラーが発生しました。価格にマイナス値は指定できません。Product のコンストラクターで価格をチェックし、マイナスの場合は例外を発生させています。
ArgumentExceptionを使う
Section titled “ArgumentExceptionを使う”引数が不正な場合は、ArgumentException を使うことがあります。
throw new ArgumentException("価格にマイナス値は指定できません。");先ほどのコードを書き換えると、次のようになります。
class Product{ public string ProductName { get; private set; } public int Price { get; private set; }
public Product(string productName, int price) { if (price < 0) { throw new ArgumentException("価格にマイナス値は指定できません。"); }
ProductName = productName; Price = price; }
public string GetDisplayText() { return $"{ProductName}:{Price}円"; }}この章では、例外を自分で発生させることもできる、という点を押さえておきましょう。
例外を使いすぎない
Section titled “例外を使いすぎない”例外は便利ですが、通常の条件分岐の代わりに何でも例外で処理するのは避けます。
たとえば、ユーザーが数値ではない文字を入力する可能性はよくあります。
そのような入力チェックは、TryParse や if 文で対応した方が自然な場合もあります。
通常よく起きる入力ミス → if文やTryParseで対応する
プログラム上、起きてはいけない不正な状態 → 例外として扱うことがある15-7 ファイル操作と例外処理
Section titled “15-7 ファイル操作と例外処理”ファイル読み込みで起きる問題
Section titled “ファイル読み込みで起きる問題”第9章では、File.ReadAllLines を使ってファイルを読み込みました。
string[] lines = File.ReadAllLines("employee_names.txt");しかし、ファイルが存在しない場合、この処理では例外が発生します。
FileNotFoundExceptionに対応する
Section titled “FileNotFoundExceptionに対応する”using System;using System.IO;
class Program{ static void Main() { try { string[] lines = File.ReadAllLines("employee_names.txt");
foreach (string line in lines) { Console.WriteLine(line); } } catch (FileNotFoundException) { Console.WriteLine("ファイルが見つかりません。"); } catch (Exception ex) { Console.WriteLine("ファイル読み込み中にエラーが発生しました。"); Console.WriteLine(ex.Message); } }}FileNotFoundException は、指定したファイルが見つからない場合に発生する例外です。
File.Existsとの使い分け
Section titled “File.Existsとの使い分け”ファイルが存在するかどうかは、File.Exists で事前に確認できます。
if (File.Exists("employee_names.txt")){ string[] lines = File.ReadAllLines("employee_names.txt");}else{ Console.WriteLine("ファイルが見つかりません。");}これは、存在チェックとして分かりやすい方法です。
ただし、ファイル操作では、存在チェックをした後に別の原因で例外が発生する可能性もあります。
ファイルは存在するが、アクセス権がないファイルは存在するが、他のアプリが使用中読み込み途中で問題が起きたそのため、必要に応じて try-catch も組み合わせます。
ファイル書き込みと例外処理
Section titled “ファイル書き込みと例外処理”ファイルの書き込みでも、例外が発生する場合があります。
using System;using System.IO;
class Program{ static void Main() { try { string text = "ログを書き込みます。";
File.WriteAllText("app.log", text);
Console.WriteLine("ファイルを書き込みました。"); } catch (IOException ex) { Console.WriteLine("ファイル書き込み中にエラーが発生しました。"); Console.WriteLine(ex.Message); } catch (Exception ex) { Console.WriteLine("予期しないエラーが発生しました。"); Console.WriteLine(ex.Message); } }}IOException は、ファイル入出力に関する問題で発生する例外です。
15-8 DB接続に向けた例外処理の考え方
Section titled “15-8 DB接続に向けた例外処理の考え方”DB接続では例外処理が重要
Section titled “DB接続では例外処理が重要”後の章では、C#からOracle Databaseに接続します。
DB接続では、次のような問題が起きる可能性があります。
Oracle Databaseが起動していない接続文字列が間違っているユーザー名またはパスワードが違うSQL文が間違っているテーブル名や列名が間違っているNULL値の扱いを間違えるネットワークやサービスの問題で接続できないこれらは、実行してみないと分からないものも多いです。
そのため、DB接続処理では例外処理が重要になります。
DB接続処理のイメージ
Section titled “DB接続処理のイメージ”まだこの章ではDB接続コードは書きません。
しかし、後の章では、次のような構造で処理を書くことになります。
try{ // DBに接続する // SQLを実行する // 結果を読み取る}catch (Exception ex){ // エラー内容を表示する}finally{ // 必要に応じて接続を閉じる}実際には、using 文を使ってDB接続やDataReaderを自動的に閉じる書き方も使います。
この章では、まず次の考え方を押さえてください。
DB接続は失敗することがある失敗したときに、プログラムがただ落ちるだけでは困るエラー内容を確認できるようにする必要な後片付けを行う例外メッセージをそのまま画面に出しすぎない
Section titled “例外メッセージをそのまま画面に出しすぎない”研修中は、学習のために ex.Message を表示しても構いません。
Console.WriteLine(ex.Message);しかし、実際の業務アプリでは、例外メッセージをそのまま利用者に見せないことも多いです。
理由は、次のような情報が含まれる可能性があるためです。
接続文字列SQL文テーブル名内部的なシステム情報業務アプリでは、利用者には分かりやすいメッセージを表示し、詳細はログに残す、という対応がよく行われます。
利用者向け: データの取得に失敗しました。管理者に連絡してください。
開発者向けログ: 実際の例外メッセージやスタックトレースを記録するこの章では、研修用として ex.Message を確認しますが、実務では表示方法に注意が必要です。
よくあるつまずき
Section titled “よくあるつまずき”この章でよくあるつまずきを確認します。
| つまずき | 原因 | 対応 |
|---|---|---|
| 例外処理の必要性が分からない | 正常系だけで考えている | 入力ミスやファイル不存在を想定する |
try の中に何を書くか分からない | 例外が発生しそうな処理を意識できていない | 変換、ファイル、DB接続などを入れる |
catch が実行されない | 例外が発生していない | 正常時は catch に入らない |
catch (Exception) だけにしてしまう | 例外の種類を分けていない | 必要に応じて具体的な例外を先に書く |
| catchの順番でエラーになる | Exception を先に書いている | 具体的な例外を先、Exception を後にする |
finally の意味が分からない | 正常時も異常時も実行されることを理解していない | 後片付け処理を書く場所と考える |
TryParse の out が分からない | 変換結果の受け取り方に慣れていない | 成功時に変換後の値を受け取ると考える |
| 例外を握りつぶしてしまう | catch だけ書いて何もしない | 最低限メッセージ表示やログ出力を行う |
| 何でも例外で処理しようとする | 条件分岐との使い分けが曖昧 | 入力チェックは TryParse や if も使う |
学んだことチェック
Section titled “学んだことチェック”次の項目について、自分で説明できるか確認してください。
- 例外とは何かを説明できる
- コンパイルエラーと実行時エラーの違いをおおまかに説明できる
-
try-catchの基本形を書ける -
FormatExceptionがどのようなときに発生するか説明できる -
ExceptionオブジェクトのMessageを表示できる - 複数の
catchを使える -
catchの順番に注意できる -
finallyの役割を説明できる -
int.TryParseを使って安全に数値入力を処理できる -
throwを使って例外を発生させられる - ファイル読み込み時の例外に対応できる
- DB接続で例外処理が重要になる理由を説明できる
研修の進め方によっては、隣の人またはチーム内で説明確認を行います。
次の内容を、自分の言葉で説明してください。
- 例外とは何ですか。
tryにはどのような処理を書きますか。catchはいつ実行されますか。FormatExceptionはどのようなときに発生しますか。finallyは何のために使いますか。int.Parseとint.TryParseの違いは何ですか。- DB接続で例外処理が重要になるのはなぜですか。
- 実務で例外メッセージをそのまま画面に出しすぎない方がよい理由は何ですか。
説明するときは、完全な答えでなくても構いません。
自分の言葉で説明しようとすることが大切です。
この章の演習課題に取り組みます。
制限時間は 75分 です。
時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。
まずは、全員が必須課題に取り組んでください。
課題15-1 int.Parseの例外を処理する
Section titled “課題15-1 int.Parseの例外を処理する”整数を入力し、int.Parse で変換してください。
数値以外が入力された場合は、エラーメッセージを表示してください。
実行例:
整数を入力してください。abc整数として正しい形式で入力してください。条件:
try-catchを使うFormatExceptionをcatchする- 正しく入力された場合は数値を表示する
課題15-2 0除算の例外を処理する
Section titled “課題15-2 0除算の例外を処理する”2つの整数を入力し、割り算の結果を表示してください。
割る数に 0 が入力された場合は、エラーメッセージを表示してください。
実行例:
割られる数を入力してください。10割る数を入力してください。00で割ることはできません。条件:
DivideByZeroExceptionをcatchする- 正常な場合は計算結果を表示する
課題15-3 finallyを使う
Section titled “課題15-3 finallyを使う”数値入力処理に finally を追加し、例外が発生してもしなくても最後にメッセージを表示してください。
実行例:
整数を入力してください。abc整数として正しい形式で入力してください。入力処理を終了します。条件:
try-catch-finallyを使うfinallyで"入力処理を終了します。"と表示する
課題15-4 TryParseで数値入力を行う
Section titled “課題15-4 TryParseで数値入力を行う”int.TryParse を使って、整数入力を処理してください。
実行例:
整数を入力してください。abc整数として正しい形式で入力してください。条件:
int.TryParseを使う- 変換に成功した場合は数値を表示する
- 変換に失敗した場合はエラーメッセージを表示する
try-catchは使わない
必須課題が終わった人は、発展課題に取り組んでください。
課題15-5 正しい整数が入力されるまで繰り返す
Section titled “課題15-5 正しい整数が入力されるまで繰り返す”TryParse と while を使い、正しい整数が入力されるまで再入力させてください。
実行例:
整数を入力してください。abc整数として正しい形式で入力してください。整数を入力してください。123入力された数値:123条件:
whileを使うint.TryParseを使う- 正しく入力されたら繰り返しを終了する
課題15-6 Productクラスで不正な価格を例外にする
Section titled “課題15-6 Productクラスで不正な価格を例外にする”Product クラスを作成し、価格にマイナス値が指定された場合は例外を発生させてください。
実行例:
エラーが発生しました。価格にマイナス値は指定できません。条件:
Productクラスを作成する- コンストラクターで価格を受け取る
- 価格が0未満なら
ArgumentExceptionを発生させる try-catchで例外を受け取る
課題15-7 ファイル読み込みの例外を処理する
Section titled “課題15-7 ファイル読み込みの例外を処理する”employee_names.txt を読み込み、内容を表示してください。
ファイルが存在しない場合は、エラーメッセージを表示してください。
実行例:
ファイルが見つかりません。条件:
using System.IO;を書くFile.ReadAllLinesを使うFileNotFoundExceptionをcatchする- その他の例外も
catch (Exception ex)で処理する
課題15-8 ファイル書き込みの例外を処理する
Section titled “課題15-8 ファイル書き込みの例外を処理する”app.log に現在日時を書き込んでください。
ファイル書き込み中に問題が起きた場合は、エラーメッセージを表示してください。
実行例:
ログを書き込みました。条件:
DateTime.Nowを使うFile.AppendAllTextを使うIOExceptionをcatchするExceptionもcatchする
課題15-9 入力補助メソッドを作成する
Section titled “課題15-9 入力補助メソッドを作成する”整数入力を行うメソッド ReadInt を作成してください。
仕様:
static int ReadInt(string message)動作:
メッセージを表示する整数が入力されるまで繰り返す正しい整数が入力されたら、その値を返す実行例:
年齢を入力してください。abc整数として正しい形式で入力してください。年齢を入力してください。25入力された年齢:25条件:
whileを使うint.TryParseを使う- 戻り値として整数を返す
課題15-10 DB接続を想定した例外処理の形を書く
Section titled “課題15-10 DB接続を想定した例外処理の形を書く”まだDB接続は行いませんが、DB接続を想定した try-catch-finally の形を書いてください。
実行結果例:
DB接続処理を開始します。ここでDB接続を行う想定です。DB接続処理を終了します。条件:
tryの中にDB接続を想定したメッセージを書くcatch (Exception ex)を書くfinallyで終了メッセージを表示する- コメントで、後の章ではOracle接続処理を書く予定であることを残す
例:
try{ Console.WriteLine("ここでDB接続を行う想定です。"); // 後の章では、ここにOracle Databaseへの接続処理を書きます。}catch (Exception ex){ Console.WriteLine("DB処理中にエラーが発生しました。"); Console.WriteLine(ex.Message);}finally{ Console.WriteLine("DB接続処理を終了します。");}Gitへの提出
Section titled “Gitへの提出”課題が終わったら、できたところまでをGitに提出します。
まず、現在の状態を確認します。
git status変更されたファイルを追加します。
git add .コミットします。
git commit -m "Chapter15 例外処理"ファイルサーバー上のリポジトリへpushします。
git pushGitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。
提出前チェックリスト
Section titled “提出前チェックリスト”提出前に、次の項目を確認してください。
-
try-catchを使えている - 例外が発生する可能性がある処理を
tryに書いている -
FormatExceptionを処理できている -
DivideByZeroExceptionを処理できている - 必要に応じて
Exceptionを処理している -
finallyを使えている -
int.TryParseを使えている -
throwを使って例外を発生させている - ファイル操作の例外を処理している
- 例外メッセージを確認できている
- インデントが整っている
- Gitにcommitしている
- Gitにpushしている
この章のまとめ
Section titled “この章のまとめ”この章では、例外処理について学習しました。
この章で学んだ主な内容は次の通りです。
- 例外は、プログラムの実行中に発生する問題である
try-catchを使うと、例外が発生したときの処理を書けるFormatExceptionは、文字列を数値に変換できない場合などに発生するDivideByZeroExceptionは、0で割ろうとした場合に発生するExceptionは、多くの例外の基本となるクラスであるex.Messageで例外メッセージを確認できる- 複数の
catchを書く場合は、具体的な例外を先に書く finallyは、例外が発生してもしなくても最後に実行されるint.TryParseを使うと、例外を発生させずに変換できるか確認できるthrowを使うと、自分で例外を発生させられる- ファイル操作では、ファイルが存在しない、アクセスできないなどの例外に注意する
- DB接続では、接続失敗やSQLエラーなどに備えて例外処理が重要になる
- 実務では、例外メッセージをそのまま利用者に見せすぎないよう注意する
次章では、C#からOracle Databaseに接続する準備 に入ります。
SQL研修で使用した pingt ユーザーと employees、departments 表を使い、C#のコンソールアプリからOracle Databaseへ接続して、SELECT文の結果を取得する流れを学習します。