C#の例外処理のサンプルです。
目次
サンプル | try...catch構文 |
例外を再スローする | |
throw文 | |
独自の例外を作成する |
try...catch構文
try { 例外が発生する可能性がある処理 } catch ( 例外のクラス 変数 ) { 例外発生時の処理 } finally{ 例外ありなしに関わらず実行する処理 } |
- 例外が起こる可能性がある箇所をtryブロックで囲みます。
- 例外が発生しcatchブロックの引数の例外のクラスの型と同じときにcatchブロックの処理が行われます。
- finallyブロックは例外のあるなしにかかわらず常に実行されます。
- 以下はMicrosoftのTry...Catch...Finally ステートメントのリンクです。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/try-catch-finally-statement
try...catch構文のコードです。
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
int num1 = 1;
int num2 = 0;
try
{
Console.WriteLine(calc1(num1, num2));
}
catch (ArithmeticException ex)
{
Console.WriteLine(ex.Message); //0 で除算しようとしました。
}
finally
{
Console.WriteLine("終了"); //終了
}
}
private static int calc1(int a,int b)
{
return a / b;
}
}
11行目は、例外が起こる可能性がある関数をtryブロックで囲んでいます。
26行目は、0で割るためArithmeticExceptionの例外が発生します。
15行目は、例外をcatchしメッセージを表示します。「0 で除算しようとしました。」
19行目は、finallyブロックでメッセージが表示されます。「終了」
例外を再スローする
catch句でthrow;を記述すると、例外を上位のcatch句に渡します。再スローと呼ばれます。
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
int num1 = 1;
int num2 = 0;
try
{
Console.WriteLine(calc1(num1, num2));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); //0 で除算しようとしました。
}
finally
{
Console.WriteLine("終了"); //終了
}
}
private static int calc1(int a,int b)
{
int c = 0;
try
{
c = a / b;
}
catch (ArithmeticException)
{
throw;
}
return c;
}
}
29行目は、0で割るためArithmeticExceptionの例外が発生します。
33行目は、throwで例外を上位のcatchに渡しています。
※throwを記述しなかった場合、15行目でキャッチされません。
15行目で例外をキャッチし文言を出力します。
throw文
throw new 例外 |
- 任意の場所で例外を投げることができます。
- 例外は以下である必要があります。
・Exceptionクラス
・Exceptionクラスのサブクラス - 以下はMicrosoftのThrow ステートメントのリンクです。
https://docs.microsoft.com/ja-jp/dotnet/visual-basic/language-reference/statements/throw-statement
throw文のサンプルです。
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
int num1 = 1;
try
{
Console.WriteLine(calc1(num1));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message); //エラーです
}
finally
{
Console.WriteLine("終了"); //終了
}
}
private static int calc1(int a)
{
if (a == 1){
throw new Exception("エラーです");
}
return a;
}
}
10行目からは、try-catch構文です。
26行目は、throw文で例外を発生させています。
14行目は、例外をcatchしメッセージを表示します。「エラーです」
独自の例外を作成する
作成するアプリに合わせた独自の例外を作成することで、例外ハンドリングを容易にし保守性と可読性を上げることができます。
独自の例外を作成するには、Exceptionクラスを継承します。
using System;
using System.Collections.Generic;
class Test1
{
static void Main()
{
int num1 = 1;
try
{
Console.WriteLine(calc1(num1));
}
catch (TestException ex)
{
Console.WriteLine(ex.Message); //独自の例外
}
finally
{
Console.WriteLine("終了"); //終了
}
}
private static int calc1(int a)
{
if (a == 1)
{
throw new TestException("独自の例外");
}
return a;
}
}
public class TestException : Exception
{
public TestException(string name)
:base(name){ }
}
32行目で、Exceptionクラスを継承して独自の例外を作成しています。
27行目は、独自のエラーをthrowしています。
35行目の:baseは、現在のインスタンスの基底クラスを参照します。
14行目でcatchされ「独自の例外」と表示されます。
関連の記事