C#

【C#】例外処理でアプリケーションを安全に(try-catch-finally)

こんにちは、リバティエンジニア[?]のFUNAです。 現役エンジニアとしてアプリケーション開発やWeb制作、SEOやブログ運営をしています。

ここではプログラミングをする際に必須となってくる例外処理の正しいやり方や注意点を私が実際に躓いたことなども紹介しながら解説したいと思います。

C# 例外処理とは?

例外はユーザーが入力フォームに想定外の文字列を入力してきたときや、 プログラムに必要なファイルが開けなかったときなどに発生します。

例えば、文字列を整数に変換する時に簡単化するために、とりあえず正の整数のみを扱うとします。 想定外の文字列を考慮しない場合プログラムとしては以下のよう記述します。

// 文字→整数
static int CharToInt(char c)
{
    return c - '0';
}

// 文字列→整数
static int StringToInt(string str)
{
    int val = 0;
    foreach(char c in str)
    {
        int i = CharToInt(c);
        val = val * 10 + i;
    }
    return val;
}

このように実装された関数を実際に使う側(ユーザー)がもし数値以外の値の入ったものを入力した時にはもちろん正常動作はしません。

このような時に想定外の事が起こった場合でも考慮する必要があるのです。
その考慮をすることを「例外処理」といいます。

C# 例外とは?

まずはそもそも「例外」について説明します。

一言で言ってしまうと、

本来ならばプログラム中で起こってはいけないことが起こってしまうこと。

しっかりとしたプログラムを作成するためには、万が一例外が起こったときでもプログラムが異常な動作をしないように例外処理(exception handling)をしなければなりません。

ですがこのあたり流石C#ですね。
例外処理を行うための専用の構文が用意されており、 プログラマが例外処理を簡単に行えるようになっていますので紹介します。

C# 例外処理の構文

ご紹介する例外処理の構文は「try-catch-finally」を使ったやり方です。

try
{
  // 例外が投げられる可能性のあるコード
}
catch("例外の種類")
{
  // 例外処理コード
}
finally
{
  // 例外発生の有無にかかわらず実行したいコード
  // リソースの破棄などを行う
}

使い方としてはこのようになります。

まず例外が発生しそうなところを"try"で囲みます。
もしその中で例外が発生した場合は、処理を中断して"catch"の中に入り例外処理をします。
"finally"では例外が出た場合も出なかった場合も必ず実行される処理を記述します。

簡単ですよね。
ある程度自分の想定できないような例外が発生しそうだと思うところではこの構文を使って、例外処理をすることをおすすめします。

この例外処理の構文は重ねて使うこともできます。
その際にしっかりと例外の種類や例外時の処理をそれぞれわけて明確化してやらないと、実際に例外が発生した時にどこで起きてどんな例外なのかわからなくなるので、注意してくださいね!(私も以前はよくやらかしてしまっていました。。)

C# 例外の種類(標準の例外クラス)

.NET Frameowrkが標準で提供している例外クラスの中でも、よく使うものをいくつか例に挙げていきます。

クラス名throw される状況
System 名前空間
ArgumentExceptionメソッドの引数が変な場合。ArgumentNullExceptionやArgumentOutOfRangeException以外の場合で変な時に使う。
ArgumentNullException引数がnullの場合。
ArgumentOutOfRangeExceptionメソッドの許容範囲外の値が引数として渡された場合。
ArithmeticException算術演算によるエラーの基本クラス。OverflowException, DivideByZeroException, NotFiniteNumberException以外の算術エラーを示したければ使う。
OverflowException算術演算やキャストでオーバーフローが起きた場合。
DivideByZeroException0で割ったときのエラー。
NotFiniteNumberException浮動小数点値が無限大の場合。
FormatException引数の書式が仕様に一致していない場合。
IndexOutOfRangeException配列のインデックスが変な場合。
InvalidCastException無効なキャストの場合。
InvalidOperationException引数以外の原因でエラーが起きた場合。
ObjectDisposedExceptionDispose済みのオブジェクトで操作が実行される場合。
NotImplementedExceptionメソッドが未実装の場合。
NotSupportedException呼び出されたメソッドがサポートされていない場合、または呼び出された機能を備えていないストリームに対して読み取り、シーク、書き込みが試行された場合。
NullReferenceExceptionnullオブジェクト参照を逆参照しようとした場合。
PlatformNotSupportException特定のプラットフォームで機能が実行されない場合。
TimeoutException指定したタイムアウト時間が経過した場合。
System.Collections.Generics 名前空間
KeyNotFoundExceptionコレクションに該当するキーが無い場合。
System.IO 名前空間
DirectoryNotFoundExceptionディレクトリが無い場合。
FileNotFoundExceptionファイルが無い場合。
EndOfStreamExceptionストリームの末尾を超えて読み込もうとしている場合。

このあたりは、よく発生しがちで必ず考慮することを忘れないようにしましょう。

【おまけ】if文などで自分で例外処理と構文を使う際の速度の違い

tyr-catchを用いた例外処理は、if文などを使った値のチェックと比べて実行速度が遅いといわれています。

tryブロックで囲んで例外が発生しなければ、ほとんどオーバーヘッドはないのですが、 例外発生時には少し大き目のコストが発生することになります。

このコストを考えても、try-catchを使うメリットの方が明らかに大きいです。
でも、避けれるのであればコストの大きな処理は避けたいというプログラマが多いのではないでしょうか。

でもやっぱり私としては安全にtry-catchで例外処理をしてほしいと思います。

もしif文などで自分で起こりそうな例外を切り出して実装したい場合などは、下の記事を参考に条件分岐してみてください。

[C#] 条件によって処理を変えてみる(if, else)


 

Kindle Unlimitedで無料で本が読める

 

Kindle Unlimitedを無料で試す

 

なら最初の30日間は無料でコーディング・デザイン・ブログ・英語・Youtubeの参考書・キャリア・副業・マーケティング・漫画・美容知識・雑誌などが読み放題です。

人気の本もあるので是非お試ししてみてください!30日以内に解約すればお金は全くかかりません。

 


最近の投稿

【今すぐ行動しよう】フリーランスエンジニアとブログの相性は抜群!

フリーランスエンジニアがスキルや経験から得たビジネスノウハウを共有する手段として「ブログ」は非常におすすめです。自身のスキルや知識のアウトプットや、実際に自分が経験したことを共有して同じような境遇の人の手助けになるような情報を公開することで自分に帰ってくるメリットは非常に多いです。今回はそのあたりについて紹介していきます。

【経験談】フリーランスのエンジニアは本当に大変なの?安定のコツやポイント

フリーランスのエンジニアは「大変だからやめとけ」という話をよく聞くので、そのことについて現役でフリーランスエンジニアとして生活している私が、その話の実態を解説しようと思います。フリーランスエンジニアの大変なところはもちろんありますが、それ以上にメリットが多いので私個人的には非常におすすめしています。

【幸福度UP】フリーランスエンジニアの「田舎暮らし」実現できます

フリーランスエンジニアとして田舎で暮らす人が増えてるって聞くけど、本当なのかな?どうやったら実現できるのか?今回はフリーランスエンジニアとして田舎で生活をしたいという方向けに、実現可能なのか、実現するにはどうすれば良いのかをご紹介します。

【単価交渉で収入アップ】フリーランスが単価交渉を成功させる4つのポイント

フリーランスが収入をアップさせるための重要な手段のひとつに「単価交渉」があります。今回は、現役でフリーランスとしてエンジニアをしている私が実践して効果のあった単価交渉の方法やコツをご紹介します。

【 今なら無料!】タスク管理ツール「Backlog」を無料で使う方法と手順

今回は、普段のタスク管理からプロジェクトの管理まで幅広く使えるツール「Backlog」を無料で使うための方法とその手段を画像つきで紹介しました。もし気に入らなければ、期間内に解約してしまえば費用はかかりません。また、以外と知られていない「フリープラン」も紹介しているので、是非参考にしてみてください。

Copyright© FUNA BLOG , 2021 All Rights Reserved.