C#/VB.NET 全ての例外処理をキャッチする方法

C#やVB.NETで全ての例外処理をキャッチする方法について解説します。

全ての例外処理をキャッチするにはどうしたらいいですか?

 Try-catchステートメントでExceptionクラスを指定すると全ての例外を処理でします。

目次

すべての例外をキャッチして対処する

 すべての例外を処理する方法として、Try-catchステートメントが利用できます。特に、catchステートメントにExceptionクラスを指定することで、実行中に発生したあらゆる例外を対処することができます。

Try
{
	処理
}catch ( Exception 変数 )
{
   例外処理
}
Try
    処理
Catch ex As Exception
    例外処理
End Try

  Exceptionクラスはすべての例外の基底クラスです。そのため、CatchブロックにExceptionクラスを指定することで、あらゆる種類の例外を処理することができます。

ただし、複数のCatchブロックがある場合は、先に記述されたCatchブロックから処理が行われるため、最後のCatchブロックにExceptionクラスを記述することが推奨されます。

これにより、その例外を処理できなかったすべての例外を処理することができるようになります。

例外を発生させてTry-Catchを利用するサンプル

 以下は、わざと例外を発生させてそれをキャッチするサンプルです。

using System;

namespace ExceptionSample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 例外をスローする可能性があるコード
                int num = int.Parse("abc");
            }
            catch (FormatException ex)
            {
                // FormatException例外を処理するコード
                Console.WriteLine("数値の変換に失敗しました。");
            }
            catch (Exception ex)
            {
                // その他の例外を処理するコード
                Console.WriteLine("予期しないエラーが発生しました。");
            }
            finally
            {
                // 例外の有無にかかわらず、必ず実行されるコード
                Console.WriteLine("プログラムを終了します。");
            }
        }
    }
}
Imports System

Module Module1

    Sub Main()
        Try
            ' 例外をスローする可能性があるコード
            Dim num As Integer = Integer.Parse("abc")
        Catch ex As FormatException
            ' FormatException例外を処理するコード
            Console.WriteLine("数値の変換に失敗しました。")
        Catch ex As Exception
            ' その他の例外を処理するコード
            Console.WriteLine("予期しないエラーが発生しました。")
        Finally
            ' 例外の有無にかかわらず、必ず実行されるコード
            Console.WriteLine("プログラムを終了します。")
        End Try
    End Sub

End Module

 上記のサンプルでは、try ステートメント内で int.Parse メソッドを使用して文字列を数値に変換しようとしています。しかし、文字列が数値として正しくないため、FormatException例外がスローされます。

 そのため、 catch ステートメントでFormatException例外を処理するコードが実行されます。

CHECK

 複数の catch ステートメントを使用することで、異なるタイプの例外を処理することができます。
また、 finally ステートメントを使用することで、例外の有無にかかわらず、必ず実行されるコードを記述することができます。

例外のログ記録を行う方法

 例外処理を行ったときには、ログを記録することが大切です。これによって、例外が発生した原因をトレースしやすくなります。また、エラーが発生したときにユーザーに通知することもできます。ログ記録には、System.Diagnostics.Traceクラスを使うのが一般的です。

下記のサンプルコードを使って、ログ記録の方法を説明します。

using System;
using System.Diagnostics;

namespace ExceptionHandlingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                int x = 0;
                int y = 10 / x;
            }
            catch (Exception ex)
            {
                Trace.WriteLine("An error occured: " + ex.Message);
                Trace.WriteLine("Stack trace: " + ex.StackTrace);
            }
        }
    }
}
Imports System
Imports System.Diagnostics

Namespace ExceptionHandlingExample
    Class Program
        Shared Sub Main(args As String())
            Try
                Dim x As Integer = 0
                Dim y As Integer = 10 / x
            Catch ex As Exception
                Trace.WriteLine("An error occured: " & ex.Message)
                Trace.WriteLine("Stack trace: " & ex.StackTrace)
            End Try
        End Sub
    End Class
End Namespace

複数の例外処理を発生させる方法

 複数の例外が発生することもあります。このような場合、try-catchブロックを複数設定することで、各例外に対応する処理を行うことができます。

 さらに、catchブロックには特定の例外タイプを指定することもできます。このように、各例外に応じた処理を行うことで、効率的な例外処理を実現することができます。

下記のサンプルコードを使って、例外処理の方法を説明します。

using System;

namespace ExceptionHandlingExample
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                int x = 0;
                int y = 10 / x;
            }
            catch (DivideByZeroException ex)
            {
                Console.WriteLine("An error occured: " + ex.Message);
                Console.WriteLine("Error type: Divide by zero error");
            }
            catch (Exception ex)
            {
                Console.WriteLine("An error occured: " + ex.Message);
                Console.WriteLine("Error type: General error");
            }
        }
    }
}
Imports System

Namespace ExceptionHandlingExample
    Class Program
        Shared Sub Main(args As String())
            Try
                Dim x As Integer = 0
                Dim y As Integer = 10 / x
            Catch ex As DivideByZeroException
                Console.WriteLine("An error occured: " & ex.Message)
                Console.WriteLine("Error type: Divide by zero error")
            Catch ex As Exception
                Console.WriteLine("An error occured: " & ex.Message)
                Console.WriteLine("Error type: General error")
            End Try
        End Sub
    End Class
End Namespace

上記のサンプルコードでは、try-catchブロックを2つ設定しています。

 各catchブロックでは、特定の例外タイプ(DivideByZeroExceptionまたはException)に応じた処理を行っています。このように、各例外に応じた処理を行うことで、効率的な例外処理を実現することができます。

リスキリングでキャリアアップしてみませんか?

リスキリング(学び直し)は、経済産業省が推奨しており、

今だけ、最大70%のキャッシュバックを受けることができます。

リスキリング 給付金が出るスクール紹介

最大70%の給付金が出るおすすめのプログラミングスクール!

国策で予算が決められているため申し込みが多い場合は早期に終了する可能性があります!

興味のある方はすぐに確認しましょう。

まとめ

全ての例外処理をキャッチする方法について解説しました。

  • すべての例外を処理する方法として、Try-catchステートメントが利用できます
  • CatchブロックにExceptionクラスを指定することで、あらゆる種類の例外を処理することができます。
  • ログ記録には、System.Diagnostics.Traceクラスを使うのが一般的です。
  • try-catchブロックを複数設定することで、各例外に対応する処理を行うことができます。
  • catchブロックには特定の例外タイプを指定することもできます。

全ての例外処理をキャッチするにはどうしたらいいですか?

 Try-catchステートメントでExceptionクラスを指定すると全ての例外を処理でします。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次