Skip to content

第15章 例外処理

この章では、プログラムの実行中に発生するエラーに対応するための 例外処理 を学習します。

これまでの章では、次のようなコードを何度も使ってきました。

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アプリで例外処理が重要になる理由を説明できる

項目内容
開発環境Visual Studio 2022
プロジェクト種類コンソール アプリ
対象フレームワーク.NET 8
プロジェクト名Chapter15_ExceptionHandling

作業を始める前に、次の内容を確認してください。

  • Console.ReadLine で入力を受け取れる
  • int.Parse で文字列を数値に変換できる
  • if 文で条件分岐できる
  • while 文で再入力処理を書ける
  • メソッドを作成できる
  • ファイルの読み書きの基本を理解している
  • 第14章の内容をGitに提出済みである

コンパイルエラーと実行時エラー

Section titled “コンパイルエラーと実行時エラー”

プログラムのエラーには、大きく分けて次のようなものがあります。

コンパイルエラー
実行前に発見されるエラー
実行時エラー
実行中に発生するエラー

コンパイルエラーの例:

Console.WriteLine("こんにちは")

このコードは、最後の ; がありません。

そのため、Visual Studio上でエラーが表示され、実行する前に問題に気づけます。

一方、次のコードはコンパイルは通ります。

string input = Console.ReadLine() ?? "";
int number = int.Parse(input);

しかし、実行時に abc のような文字列を入力すると、整数に変換できずエラーになります。

このように、実行中に発生する問題を 例外 と呼びます。


次のコードを入力して実行してください。

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で実行している場合、例外が発生した行で停止することがあります。


int.Parse で数値に変換できない文字列を渡すと、FormatException が発生します。

FormatException
入力文字列の形式が正しくない場合に発生する例外

たとえば、次のような入力は整数に変換できません。

abc
12.5
一二三
空文字

このような場合に、プログラムがそのまま終了しないようにするため、例外処理を使います。


例外処理の基本形は、try-catch です。

try
{
例外が発生する可能性がある処理
}
catch
{
例外が発生したときの処理
}

try ブロックの中で例外が発生すると、catch ブロックに処理が移ります。


次のコードを入力して実行してください。

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 によって処理されているため、プログラム全体が途中で強制終了せずに済みます。


数値を入力した場合は、catch は実行されません。

実行例:

整数を入力してください。
123
入力された数値:123
処理を終了します。

この場合、try ブロックの中の処理が正常に最後まで実行されます。


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 は、例外を表す基本的なクラスです。

多くの例外は、Exception をもとにしたクラスとして用意されています。

代表的な例は次の通りです。

例外クラス主な発生例
FormatException数値変換に失敗した
DivideByZeroException0で割ろうとした
FileNotFoundExceptionファイルが見つからない
IOExceptionファイル操作で問題が起きた
InvalidOperationException操作できない状態で処理を行った

この章では、すべてを覚える必要はありません。

まずは、例外には種類があり、catch で受け取って対応できることを理解しましょう。


例外の種類ごとに処理を分ける

Section titled “例外の種類ごとに処理を分ける”

catch は複数書くことができます。

try
{
処理
}
catch (FormatException)
{
数値変換エラーの場合の処理
}
catch (Exception)
{
その他のエラーの場合の処理
}

例外の種類ごとにメッセージを変えたい場合などに使います。


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 が実行されます。


次のコードでは、割り算を行います。

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
割る数を入力してください。
0
0で割ることはできません。

0で整数の割り算を行うと、DivideByZeroException が発生します。


複数の catch を書く場合、具体的な例外を先に書きます。

正しい例:

catch (FormatException)
{
Console.WriteLine("形式が正しくありません。");
}
catch (Exception)
{
Console.WriteLine("その他のエラーです。");
}

Exception は多くの例外を受け取れるため、先に書いてしまうと、後ろの具体的な catch に到達しません。

そのため、次のような順番は避けます。

catch (Exception)
{
Console.WriteLine("その他のエラーです。");
}
catch (FormatException)
{
Console.WriteLine("形式が正しくありません。");
}

このように書くと、FormatExceptioncatch が実行される機会がなくなってしまいます。


finally は、例外が発生してもしなくても、最後に必ず実行したい処理を書くために使います。

try
{
例外が発生する可能性がある処理
}
catch
{
例外が発生したときの処理
}
finally
{
最後に必ず実行したい処理
}

たとえば、次のような処理に使われます。

ファイルを閉じる
DB接続を閉じる
後片付けをする
ログを出力する

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
入力された数値:123
finallyの処理です。
プログラムを終了します。

数値以外を入力した場合:

整数を入力してください。
abc
整数として正しい形式で入力してください。
finallyの処理です。
プログラムを終了します。

どちらの場合でも、finally の処理は実行されます。


後の章では、Oracle Databaseへ接続します。

DB接続では、接続を開いたら、使い終わった後に閉じる必要があります。

DBに接続する
SQLを実行する
結果を読み取る
DB接続を閉じる

例外が発生した場合でも、DB接続を開いたままにしないようにする必要があります。

そのため、例外が発生してもしなくても実行される finally は重要です。

ただし、実際のC#では、後の章で扱う using 文を使って、接続を自動的に閉じる書き方もよく使います。

この章では、まず finally の役割を理解しておきましょう。


15-5 TryParseを使った入力チェック

Section titled “15-5 TryParseを使った入力チェック”

例外を使わずに変換できるか確認する

Section titled “例外を使わずに変換できるか確認する”

数値入力では、int.Parsetry-catch を組み合わせる方法もあります。

しかし、入力チェックでは int.TryParse を使うことも多いです。

TryParse は、変換に成功したかどうかを true / false で返します。

bool success = int.TryParse(input, out number);

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 “正しい数値が入力されるまで繰り返す”

TryParsewhile を組み合わせると、正しい数値が入力されるまで再入力させることができます。

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 の方が自然な場合もあります。


方法特徴向いている場面
int.Parse変換できないと例外が発生する入力が正しい前提の場合
int.TryParse変換できるか確認できるユーザー入力を安全に処理する場合

コンソールアプリや画面アプリでユーザー入力を扱う場合、TryParse は非常によく使います。


プログラムの中で、あえて例外を発生させたい場合があります。

たとえば、商品価格にマイナス値が指定された場合、プログラムとして不正な値だと判断できます。

このような場合に throw を使います。

throw new Exception("エラーメッセージ");

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 を使うことがあります。

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}";
}
}

この章では、例外を自分で発生させることもできる、という点を押さえておきましょう。


例外は便利ですが、通常の条件分岐の代わりに何でも例外で処理するのは避けます。

たとえば、ユーザーが数値ではない文字を入力する可能性はよくあります。

そのような入力チェックは、TryParseif 文で対応した方が自然な場合もあります。

通常よく起きる入力ミス
→ if文やTryParseで対応する
プログラム上、起きてはいけない不正な状態
→ 例外として扱うことがある

ファイル読み込みで起きる問題

Section titled “ファイル読み込みで起きる問題”

第9章では、File.ReadAllLines を使ってファイルを読み込みました。

string[] lines = File.ReadAllLines("employee_names.txt");

しかし、ファイルが存在しない場合、この処理では例外が発生します。


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 で事前に確認できます。

if (File.Exists("employee_names.txt"))
{
string[] lines = File.ReadAllLines("employee_names.txt");
}
else
{
Console.WriteLine("ファイルが見つかりません。");
}

これは、存在チェックとして分かりやすい方法です。

ただし、ファイル操作では、存在チェックをした後に別の原因で例外が発生する可能性もあります。

ファイルは存在するが、アクセス権がない
ファイルは存在するが、他のアプリが使用中
読み込み途中で問題が起きた

そのため、必要に応じて try-catch も組み合わせます。


ファイルの書き込みでも、例外が発生する場合があります。

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接続に向けた例外処理の考え方”

後の章では、C#からOracle Databaseに接続します。

DB接続では、次のような問題が起きる可能性があります。

Oracle Databaseが起動していない
接続文字列が間違っている
ユーザー名またはパスワードが違う
SQL文が間違っている
テーブル名や列名が間違っている
NULL値の扱いを間違える
ネットワークやサービスの問題で接続できない

これらは、実行してみないと分からないものも多いです。

そのため、DB接続処理では例外処理が重要になります。


まだこの章ではDB接続コードは書きません。

しかし、後の章では、次のような構造で処理を書くことになります。

try
{
// DBに接続する
// SQLを実行する
// 結果を読み取る
}
catch (Exception ex)
{
// エラー内容を表示する
}
finally
{
// 必要に応じて接続を閉じる
}

実際には、using 文を使ってDB接続やDataReaderを自動的に閉じる書き方も使います。

この章では、まず次の考え方を押さえてください。

DB接続は失敗することがある
失敗したときに、プログラムがただ落ちるだけでは困る
エラー内容を確認できるようにする
必要な後片付けを行う

例外メッセージをそのまま画面に出しすぎない

Section titled “例外メッセージをそのまま画面に出しすぎない”

研修中は、学習のために ex.Message を表示しても構いません。

Console.WriteLine(ex.Message);

しかし、実際の業務アプリでは、例外メッセージをそのまま利用者に見せないことも多いです。

理由は、次のような情報が含まれる可能性があるためです。

接続文字列
SQL文
テーブル名
内部的なシステム情報

業務アプリでは、利用者には分かりやすいメッセージを表示し、詳細はログに残す、という対応がよく行われます。

利用者向け:
データの取得に失敗しました。管理者に連絡してください。
開発者向けログ:
実際の例外メッセージやスタックトレースを記録する

この章では、研修用として ex.Message を確認しますが、実務では表示方法に注意が必要です。


この章でよくあるつまずきを確認します。

つまずき原因対応
例外処理の必要性が分からない正常系だけで考えている入力ミスやファイル不存在を想定する
try の中に何を書くか分からない例外が発生しそうな処理を意識できていない変換、ファイル、DB接続などを入れる
catch が実行されない例外が発生していない正常時は catch に入らない
catch (Exception) だけにしてしまう例外の種類を分けていない必要に応じて具体的な例外を先に書く
catchの順番でエラーになるException を先に書いている具体的な例外を先、Exception を後にする
finally の意味が分からない正常時も異常時も実行されることを理解していない後片付け処理を書く場所と考える
TryParseout が分からない変換結果の受け取り方に慣れていない成功時に変換後の値を受け取ると考える
例外を握りつぶしてしまうcatch だけ書いて何もしない最低限メッセージ表示やログ出力を行う
何でも例外で処理しようとする条件分岐との使い分けが曖昧入力チェックは TryParseif も使う

次の項目について、自分で説明できるか確認してください。

  • 例外とは何かを説明できる
  • コンパイルエラーと実行時エラーの違いをおおまかに説明できる
  • try-catch の基本形を書ける
  • FormatException がどのようなときに発生するか説明できる
  • Exception オブジェクトの Message を表示できる
  • 複数の catch を使える
  • catch の順番に注意できる
  • finally の役割を説明できる
  • int.TryParse を使って安全に数値入力を処理できる
  • throw を使って例外を発生させられる
  • ファイル読み込み時の例外に対応できる
  • DB接続で例外処理が重要になる理由を説明できる

研修の進め方によっては、隣の人またはチーム内で説明確認を行います。

次の内容を、自分の言葉で説明してください。

  1. 例外とは何ですか。
  2. try にはどのような処理を書きますか。
  3. catch はいつ実行されますか。
  4. FormatException はどのようなときに発生しますか。
  5. finally は何のために使いますか。
  6. int.Parseint.TryParse の違いは何ですか。
  7. DB接続で例外処理が重要になるのはなぜですか。
  8. 実務で例外メッセージをそのまま画面に出しすぎない方がよい理由は何ですか。

説明するときは、完全な答えでなくても構いません。
自分の言葉で説明しようとすることが大切です。


この章の演習課題に取り組みます。

制限時間は 75分 です。

時間内にすべて完成しなくても構いません。
できたところまでを保存し、Gitに提出してください。


まずは、全員が必須課題に取り組んでください。


課題15-1 int.Parseの例外を処理する

Section titled “課題15-1 int.Parseの例外を処理する”

整数を入力し、int.Parse で変換してください。
数値以外が入力された場合は、エラーメッセージを表示してください。

実行例:

整数を入力してください。
abc
整数として正しい形式で入力してください。

条件:

  • try-catch を使う
  • FormatExceptioncatch する
  • 正しく入力された場合は数値を表示する

課題15-2 0除算の例外を処理する

Section titled “課題15-2 0除算の例外を処理する”

2つの整数を入力し、割り算の結果を表示してください。
割る数に 0 が入力された場合は、エラーメッセージを表示してください。

実行例:

割られる数を入力してください。
10
割る数を入力してください。
0
0で割ることはできません。

条件:

  • DivideByZeroExceptioncatch する
  • 正常な場合は計算結果を表示する

数値入力処理に 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 正しい整数が入力されるまで繰り返す”

TryParsewhile を使い、正しい整数が入力されるまで再入力させてください。

実行例:

整数を入力してください。
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 を使う
  • FileNotFoundExceptioncatch する
  • その他の例外も catch (Exception ex) で処理する

課題15-8 ファイル書き込みの例外を処理する

Section titled “課題15-8 ファイル書き込みの例外を処理する”

app.log に現在日時を書き込んでください。
ファイル書き込み中に問題が起きた場合は、エラーメッセージを表示してください。

実行例:

ログを書き込みました。

条件:

  • DateTime.Now を使う
  • File.AppendAllText を使う
  • IOExceptioncatch する
  • Exceptioncatch する

課題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に提出します。

まず、現在の状態を確認します。

Terminal window
git status

変更されたファイルを追加します。

Terminal window
git add .

コミットします。

Terminal window
git commit -m "Chapter15 例外処理"

ファイルサーバー上のリポジトリへpushします。

Terminal window
git push

Gitの操作でエラーが出た場合は、自己判断で同じ操作を繰り返さず、講師に確認してください。


提出前に、次の項目を確認してください。

  • try-catch を使えている
  • 例外が発生する可能性がある処理を try に書いている
  • FormatException を処理できている
  • DivideByZeroException を処理できている
  • 必要に応じて Exception を処理している
  • finally を使えている
  • int.TryParse を使えている
  • throw を使って例外を発生させている
  • ファイル操作の例外を処理している
  • 例外メッセージを確認できている
  • インデントが整っている
  • Gitにcommitしている
  • Gitにpushしている

この章では、例外処理について学習しました。

この章で学んだ主な内容は次の通りです。

  • 例外は、プログラムの実行中に発生する問題である
  • try-catch を使うと、例外が発生したときの処理を書ける
  • FormatException は、文字列を数値に変換できない場合などに発生する
  • DivideByZeroException は、0で割ろうとした場合に発生する
  • Exception は、多くの例外の基本となるクラスである
  • ex.Message で例外メッセージを確認できる
  • 複数の catch を書く場合は、具体的な例外を先に書く
  • finally は、例外が発生してもしなくても最後に実行される
  • int.TryParse を使うと、例外を発生させずに変換できるか確認できる
  • throw を使うと、自分で例外を発生させられる
  • ファイル操作では、ファイルが存在しない、アクセスできないなどの例外に注意する
  • DB接続では、接続失敗やSQLエラーなどに備えて例外処理が重要になる
  • 実務では、例外メッセージをそのまま利用者に見せすぎないよう注意する

次章では、C#からOracle Databaseに接続する準備 に入ります。

SQL研修で使用した pingt ユーザーと employeesdepartments 表を使い、C#のコンソールアプリからOracle Databaseへ接続して、SELECT文の結果を取得する流れを学習します。