.net column
.NET開発者のためのブログメディア

図形の作成

C#のtry~catchの使い方の紹介!|try~catchで例外処理を正しく使いこなそう

2021年03月09日
SE
try~catchの例外処理は具体的にどのような処理ができるのですか。
PM
try~catch文は例外処理のほか、さまざまな便利な使い方ができます。詳しくご紹介いたしましょう。

C#のtry~catchとは?


C#では何かの処理を行った時に問題が発生すると、Exceptionという例外が発生します。

try~catch文はそういった例外を処理するのに役立つ機能です。またそれ以外にも便利な使い方ができるので、是非マスターしましょう。

まずは簡単なサンプルを見ていきましょう。以下はtry~catchの使用例です。

catchで例外をキャッチできる

上のC#サンプルでは、try節の中で文字列sの長さを表示しようとしています。しかしsはnullのため例外のExceptionが発生します。それをcatchで文字通りキャッチできるのです。そしてcatch節で例外の内容を表示します。

このサンプルを実行すると以下のような表示が出ます。

Exceptionのサブクラスもキャッチできる

上のC#サンプルでは参照がnullだった時に発生するNullReferenceExceptionが発生します。しかしcatchで指定しているのはExceptionクラスです。実はcatchは指定したクラスのサブクラスも受けることができます。NullReferenceExceptionがExceptionのサブクラスなのでキャッチできるのです。

このようにExceptionのサブクラスを一括でcatchするのではなく、例外の種類に応じてtry~catchすることもできます。以下のC#サンプルをご覧ください。

複数の種類の例外を個別にキャッチできる

上のC#サンプルを実行すると、0で割り算をしているため例外が発生し、

0で除算しています。

と表示されます。上の方のcatchが優先されるので、ExceptionよりDivideByZeroExceptionが優先されます。

例外はキャッチするだけでなく投げることもできます。以下のサンプルをご覧ください。

自分で例外を投げることもできる

上のC#サンプルを実行すると、まずtry節の中でthrowにより1つ目の例外を投げます。すぐにキャッチされて、catch節の中で2つ目の例外を投げます。このように自らExceptionを発生させることもできるのです。

catchにはwhen句で条件を付けることができます。以下のように行います。

 

実行すると、以下の通りに表示されます。Messageの文字列が指定の通りだった時のみ、catchの処理が行なわれます。

ラムダ式でもthrowできる

C#にはラムダ式という文法がありますが、C# 7からそこでも例外を投げることができるようになりました。

 

これを実行すると「グッドです!」と表示されますが、GetGoodStrを以下のようにすることができます。

 

この場合は実行すると未実装の意味を示すNotImplementedExceptionが発生します。作っている途中のラムダ式に使用するとよいでしょう。

null合体演算子でもthrowできる

C#にはnull合体演算子の??という機能があります。以下のサンプルをご覧ください。

 

oがnullの場合、??の右の文字列を入れてくれます。これにthrowを使用して、以下のようにnullだった場合に例外を投げることができます。

三項演算子でもthrowできる

C#には三項演算子(条件演算子)があります。以下の場合、

 

のようにして例外を投げるようにすることが可能です。

finallyの使い方

C#にはtry~catchと一緒に使うと便利なfinallyという構文があります。以下のように使われるのが一般的です。なおこれを実行する場合、ソースの先頭に「using System.IO;」を追加してください。

finallyは後始末を確実に行ってくれる

上のC#サンプルは、ファイルを読み込んで中身を表示します。ファイルが無かった場合はIOExceptionが発生して、エラーメッセージを表示します。そしてfinally節でファイルのCloseを行っています。

finallyに書かれた処理は、何があろうと必ず実行されます。例外が発生しても、必ず実行されるのです。だからこのようなファイルのCloseなど忘れてはならない後始末処理にとても便利なのです。

finallyの代わりにusingを使えるケースもある

ただしC#では、上のようなケースはfinallyではなくusingを使う方がおすすめです。上のサンプルでusingを使うと以下のようになります。

usingによる終了処理にはIDisposableの実装が必要

上のサンプルではusingで記述したStreamReaderは{}を抜けた後に確実にCloseされます。それが行われる条件は、対象のクラスがIDisposableを実装していることです。StreamReaderの親クラスのTextReaderはIDisposableを実装しているので、Closeしてくれます。

usingで記述した処理の終了処理が必ず実行されるわけではないことに注意してください。IDisposableを実装してないのであれば、finallyを使いましょう。

SE
なるほど。try~catchは是非とも使いこなしたい機能ですね。
PM
そうですね。try~catchを使いこなせるように、ご紹介したコードをご自身で書いてみてください。

C#のtry~catchで例外処理を使いこなそう

C#のtry~catchについて解説しましたがご理解頂けましたでしょうか。

処理中に問題が起きたときにif文などで対応せずに例外を投げてcatch内で処理するようにしたほうが、正常処理と異常処理を分離できるので良いコードになります。

是非try~catchを活用しましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags

Jobs