C#:例外処理の基本

c_charp_logo C#

プログラムが、実行中に止まってしまうことは避けなければなりません。
実行中にプログラムが止まらないようにする仕組みとして例外処理があります。

C#では、安全策としてtry~catch文が用意されています。
フリーズしないプログラムの為にもぜひとも使いこなして下さい。

フリーズとは?

それでは具体例を交えて説明します。
例えば以下のプログラムは、100をキーボードから入力した値で除算するものです。

using System;

namespace 例外処理を使わない場合
{
	class Program
	{
		static void Main(string[] args)
		{
			int x = 100;

			Console.Write("{0}をいくつで割りますか? ");
			int y = int.Parse(Console.ReadLine());

			int result = x / y;
			Console.WriteLine("結果: {0}", result);
		}
	}
}

0以外の整数を入力してもフリーズしませんが、0を入力すると

ハンドルされていない例外: System.DivideByZeroException: 0 で除算しようとしました。

というエラーが出てプログラムが強制終了してしまいます。

また、0.1などの実数を入力して実行してみてください。

ハンドルされていない例外: System.FormatException: 入力文字列の形式が正しくありません。

というエラーが出てやはり強制終了してしまいます。

こんなとき、try~catch文の出番です。

ちなみにSystem.DivideByZeroExceptionのエラーは、

int result = x / y;

の行に対して出ているエラーで、System.FormatExceptionは、

int y = int.Parse(Console.ReadLine());

の行に対して出ています。

基本的な使い方は、

try{
	// エラーが発生しそうな処理
	
	
} catch( 例外名1 ){
	// 例外1のエラーが発生したときの処理

} catch( 例外名2 ){
	// 例外2のエラーが発生したときの処理
}

のように記述します。
例外名に記述するものはエラーが発生たときに出力される情報から判断できます。

0除算の場合のエラーであれば、

ハンドルされていない例外: System.DivideByZeroException: 0 で除算しようとしました。

というメッセージが出力されるので、System.のあとのDivideByZeroExceptionが例外名と判断できます。

ちなみに上記のSystem.********の部分がC#の例外種類を表しています。
Systemクラスに定義されている例外クラスという意味になります。

今回のエラーであれば、以下のように対処できます。

using System;

namespace 例外処理の基本
{
	class Program
	{
		static void Main(string[] args)
		{
			int x = 100, y, result;

			Console.Write("{0}をいくつで割りますか? ", x);

			try
			{
				y = int.Parse(Console.ReadLine());
				result = x / y;
				Console.WriteLine("結果: {0}", result);
			}
			catch (FormatException fe)		// 変換できない文字のときのエラー
			{
				Console.WriteLine("int型ではありません");
			}
			catch (DivideByZeroException de)	// 0除算のエラー
			{
				Console.WriteLine("0で割ることはできません");
			}

		}
	}
}

ぜひフリーズしないプログラムを作ってみてください。

コメント

タイトルとURLをコピーしました