フッターコンテンツにスキップ
.NETヘルプ

C# の Try/Catch (開発者向けの仕組み)

C#プログラミングに慣れていない場合は、「try catch」ステートメントという用語を何度か聞いたことがあるかもしれません。 このチュートリアルでは、例外処理の世界を掘り下げ、キャッチブロックに焦点を当て、コードをエラーに対してより堅牢にするためにtryとcatchステートメントをどのように使用できるかを探ります。 その過程で、理解を固めるための実際の例をたくさん提供します。

例外とは何か、それを処理する理由

C#では、例外とは、プログラムが実行中に発生し、プログラムの標準的な命令実行の流れを妨げる出来事を指します。 例外が発生すると、プログラムの流れは転換され、例外が処理されない限り、プログラムは突然終了します。

例外処理は、これらの破壊的イベントを予測し管理する方法であり、プログラムが予期しない問題から回復し、意図どおりに続行できるようにします。 tryとcatchブロックを使用することで、コードがエラーを優雅に処理し、ユーザーに意味のあるフィードバックを提供することができます。

Tryブロック

tryブロックは、例外が発生する可能性があると予期されるコードセグメントです。 コードをtryブロックでラップすると、コンパイラーに対して、そのブロック内で発生する可能性のある例外を処理したいことを伝えます。

tryブロックを使用する基本的な例を次に示します。

try
{
    // Code that may generate an exception
}
catch (Exception ex)
{
    // Handle the exception
}
try
{
    // Code that may generate an exception
}
catch (Exception ex)
{
    // Handle the exception
}
Try
	' Code that may generate an exception
Catch ex As Exception
	' Handle the exception
End Try
$vbLabelText   $csharpLabel

捕捉する例外をキャッチするブロック

catchステートメントは、例外を処理するためにtryブロックと共に使用されます。 tryブロック内で例外が発生すると、プログラムの実行は適切なcatchブロックにジャンプし、例外に対するプログラムの対応を指定することができます。

例外を捕捉するには、tryブロックの直後にcatchブロックを作成する必要があります。 catchブロックには通常、捕捉された例外を表すパラメータが含まれます。

アクション中のcatchステートメントの例を次に示します。

try
{
    int result = 10 / 0;
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("An error occurred: " + ex.Message);
}
try
{
    int result = 10 / 0;
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("An error occurred: " + ex.Message);
}
Try
	Dim result As Integer = 10 \ 0
Catch ex As DivideByZeroException
	Console.WriteLine("An error occurred: " & ex.Message)
End Try
$vbLabelText   $csharpLabel

この例では、tryブロック内のコードがゼロでの除算を試みて、DivideByZeroExceptionを生成します。 その後、catchブロックが例外を処理し、ユーザーにメッセージを表示します。

異なる例外を処理する複数のキャッチブロック

場合によっては、tryブロックで異なるタイプの可能性のある例外が発生することがあります。 そのような場合、複数のcatchブロックを使用して、各例外タイプを個別に処理できます。

複数のcatchブロックの使用方法を示す例を以下に示します。

try
{
    int[] numbers = new int[7];
    numbers[12] = 70; // This line will throw an exception
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("An index out of range error occurred: " + ex.Message);
}
catch (Exception e)
{
    Console.WriteLine("An unexpected error occurred: " + e.Message);
}
try
{
    int[] numbers = new int[7];
    numbers[12] = 70; // This line will throw an exception
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("An index out of range error occurred: " + ex.Message);
}
catch (Exception e)
{
    Console.WriteLine("An unexpected error occurred: " + e.Message);
}
Try
	Dim numbers(6) As Integer
	numbers(12) = 70 ' This line will throw an exception
Catch ex As IndexOutOfRangeException
	Console.WriteLine("An index out of range error occurred: " & ex.Message)
Catch e As Exception
	Console.WriteLine("An unexpected error occurred: " & e.Message)
End Try
$vbLabelText   $csharpLabel

この例では、tryブロック内のコードが存在しない配列インデックスに値を割り当てようとして、IndexOutOfRangeExceptionを生成します。 最初のcatchブロックがこの特定の例外を処理し、二番目のcatchブロックが発生する可能性のある他の例外を捕捉します。

複数のcatchブロックを使用する場合、常に最も特定の例外タイプから最も一般的なものへ順序を付けてください。

キャッチブロックに条件を追加する例外フィルター

例外フィルターを使用すると、特定の条件が満たされた場合のみ例外を捕捉するための条件をキャッチブロックに追加できます。 例外フィルターを使用するには、catchステートメントでwhenキーワードの後に条件を追加します。

例外フィルターの使用を示す例を以下に示します。

try
{
    int result = 10 / 0;
}
catch (DivideByZeroException ex) when (ex.Message.Contains("divide"))
{
    Console.WriteLine("An error occurred: " + ex.Message);
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("A different divide by zero error occurred: " + ex.Message);
}
try
{
    int result = 10 / 0;
}
catch (DivideByZeroException ex) when (ex.Message.Contains("divide"))
{
    Console.WriteLine("An error occurred: " + ex.Message);
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("A different divide by zero error occurred: " + ex.Message);
}
Try
	Dim result As Integer = 10 \ 0
Catch ex As DivideByZeroException When ex.Message.Contains("divide")
	Console.WriteLine("An error occurred: " & ex.Message)
Catch ex As DivideByZeroException
	Console.WriteLine("A different divide by zero error occurred: " & ex.Message)
End Try
$vbLabelText   $csharpLabel

上記の例では、最初のcatchブロックは、例外メッセージに「divide」という単語が含まれている場合のみDivideByZeroExceptionを処理します。 条件が満たされない場合、二番目のキャッチブロックが例外を処理します。

最終的なコード実行を保証するFinallyブロック

場合によっては、例外の有無にかかわらず特定のコード片を実行したいことがあります。 これを達成するには、finallyブロックを使用できます。

finallyブロックは、tryおよびcatchブロックの後に配置され、例外の有無にかかわらず常に実行されます。

finallyブロックの使用を示す例を次に示します。

try
{
    int result = 10 / 2;
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("An error occurred: " + ex.Message);
}
finally
{
    Console.WriteLine("This line will always be executed.");
}
try
{
    int result = 10 / 2;
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("An error occurred: " + ex.Message);
}
finally
{
    Console.WriteLine("This line will always be executed.");
}
Try
	Dim result As Integer = 10 \ 2
Catch ex As DivideByZeroException
	Console.WriteLine("An error occurred: " & ex.Message)
Finally
	Console.WriteLine("This line will always be executed.")
End Try
$vbLabelText   $csharpLabel

上記の例では、たとえtryブロック内のコードが例外を生成しなくても、finallyブロックは依然として実行されます。

カスタム例外:必要に応じた例外の調整

場合によっては、特定の例外を処理するために独自のカスタム例外を作成したくなるかもしれません。 これを行うには、Exceptionクラスから継承する新しいクラスを作成できます。

カスタム例外の作成例を次に示します。

public class CustomException : Exception
{
    public CustomException(string errorMessage) : base(errorMessage)
    {
    }
}
public class CustomException : Exception
{
    public CustomException(string errorMessage) : base(errorMessage)
    {
    }
}
Public Class CustomException
	Inherits Exception

	Public Sub New(ByVal errorMessage As String)
		MyBase.New(errorMessage)
	End Sub
End Class
$vbLabelText   $csharpLabel

今度は、このカスタム例外をtryおよびcatchブロックで使用できます。

try
{
    throw new CustomException("This is a custom exception.");
}
catch (CustomException ex)
{
    Console.WriteLine("A custom exception occurred: " + ex.Message);
}
try
{
    throw new CustomException("This is a custom exception.");
}
catch (CustomException ex)
{
    Console.WriteLine("A custom exception occurred: " + ex.Message);
}
Try
	Throw New CustomException("This is a custom exception.")
Catch ex As CustomException
	Console.WriteLine("A custom exception occurred: " & ex.Message)
End Try
$vbLabelText   $csharpLabel

この例では、tryブロックがCustomExceptionインスタンスをスローし、次にcatchブロックがそれを捕捉して処理します。

IronPDF:例外処理とPDF機能の統合

IronPDFについてさらに学ぶは、C#でPDFファイルを作成、編集、およびコンテンツを抽出するための人気のあるライブラリです。 このセクションでは、IronPDFを例外処理のtry-catchアプローチに統合し、潜在的なエラーを優雅に処理する方法を探ります。

IronPDFのインストール

始めるには、まずIronPDFのNuGetパッケージをインストールする必要があります。 パッケージマネージャーコンソールを使用してこれを行うことができます。

Install-Package IronPdf

または、Visual Studioの「NuGetパッケージの管理」ダイアログで「IronPDF」を検索することもできます。

IronPDFでPDFを作成し、例外を処理する

IronPDFでHTML文字列からPDFファイルを作成したいとします。 PDFを作成するプロセスで例外が発生する可能性があるため、try-catchブロックを使用してそれを処理できます。 IronPDFを使用してPDFを作成し、try-catchで例外を処理する方法の例を次に示します。

using IronPdf;
using System;

try
{
    var renderer = new ChromePdfRenderer();
    string html = "Hello, World!";
    PdfDocument PDF = renderer.RenderHtmlAsPdf(html);
    PDF.SaveAs("output.PDF");
    Console.WriteLine("PDF created successfully.");
}
catch (Exception ex)
{
    Console.WriteLine("An unexpected error occurred: " + ex.Message);
}
using IronPdf;
using System;

try
{
    var renderer = new ChromePdfRenderer();
    string html = "Hello, World!";
    PdfDocument PDF = renderer.RenderHtmlAsPdf(html);
    PDF.SaveAs("output.PDF");
    Console.WriteLine("PDF created successfully.");
}
catch (Exception ex)
{
    Console.WriteLine("An unexpected error occurred: " + ex.Message);
}
Imports IronPdf
Imports System

Try
	Dim renderer = New ChromePdfRenderer()
	Dim html As String = "Hello, World!"
	Dim PDF As PdfDocument = renderer.RenderHtmlAsPdf(html)
	PDF.SaveAs("output.PDF")
	Console.WriteLine("PDF created successfully.")
Catch ex As Exception
	Console.WriteLine("An unexpected error occurred: " & ex.Message)
End Try
$vbLabelText   $csharpLabel

この例では、tryブロックにIronPDFを使用してPDFを作成するコードが含まれています。 処理中に例外が発生した場合、catchブロックがエラーを処理し、ユーザーに関連するエラーメッセージを表示します。

PDFからテキストを抽出し、例外を処理する

また、IronPDFを使用してPDFファイルからテキストを抽出したいかもしれません。 前の例と同様に、潜在的な例外を処理するためにtry-catchブロックを使用できます。

IronPDFを使用してPDFファイルからテキストを抽出し、例外を処理する例を次に示します。

using IronPdf;
using System;
using System.IO;

try
{
    string pdfPath = "input.PDF";
    if (File.Exists(pdfPath))
    {
        PdfDocument PDF = PdfDocument.FromFile(pdfPath);
        string extractedText = PDF.ExtractAllText();
        Console.WriteLine("Text extracted successfully: " + extractedText);
    }
    else
    {
        Console.WriteLine("The specified PDF file does not exist.");
    }
}
catch (Exception ex)
{
    Console.WriteLine("An unexpected error occurred: " + ex.Message);
}
using IronPdf;
using System;
using System.IO;

try
{
    string pdfPath = "input.PDF";
    if (File.Exists(pdfPath))
    {
        PdfDocument PDF = PdfDocument.FromFile(pdfPath);
        string extractedText = PDF.ExtractAllText();
        Console.WriteLine("Text extracted successfully: " + extractedText);
    }
    else
    {
        Console.WriteLine("The specified PDF file does not exist.");
    }
}
catch (Exception ex)
{
    Console.WriteLine("An unexpected error occurred: " + ex.Message);
}
Imports IronPdf
Imports System
Imports System.IO

Try
	Dim pdfPath As String = "input.PDF"
	If File.Exists(pdfPath) Then
		Dim PDF As PdfDocument = PdfDocument.FromFile(pdfPath)
		Dim extractedText As String = PDF.ExtractAllText()
		Console.WriteLine("Text extracted successfully: " & extractedText)
	Else
		Console.WriteLine("The specified PDF file does not exist.")
	End If
Catch ex As Exception
	Console.WriteLine("An unexpected error occurred: " & ex.Message)
End Try
$vbLabelText   $csharpLabel

C#でのTry/Catch(開発者のための作業方法)図1

この例では、tryブロックにIronPDFを使用してPDFからテキストを抽出するコードが含まれています。 処理中に例外が発生した場合、catchブロックがエラーを処理し、ユーザーに関連するメッセージを表示します。

結論

IronPDFを例外処理のtry-catchアプローチと組み合わせることで、PDFファイルを操作する際にエラーを優雅に処理する堅牢なアプリケーションを作成することができます。 これによりアプリケーションの安定性が向上するだけでなく、全体的なユーザーエクスペリエンスも向上します。

外部ライブラリのIronPDFを使用する際には、常に潜在的な例外を考慮し、tryおよびcatchステートメントを適切に使用して処理してください。 このようにして、アプリケーションが予期しない問題にも堅牢でユーザーフレンドリーであることを保証できます。

IronPDFはライブラリの無料トライアルを提供しており、コミットなしにその機能を探索できます。 トライアル期間後にIronPDFの使用を続けることを決定した場合、ライセンスは$799から始まります。

よくある質問

C#におけるtry-catchブロックの目的は何ですか?

C#のtry-catchブロックは、プログラムの実行中に発生する可能性のある例外を処理するために使用されます。tryブロックには例外を投げる可能性のあるコードが含まれ、catchブロックにはエラーを処理してプログラムをスムーズに続行するためのコードが含まれます。

C#でのPDF操作の際、どのように例外処理を実装できますか?

C#でのPDF操作の際に、PDFの作成や操作に関わる処理を囲むtry-catchブロックを使用して例外処理を実装できます。これにより、ファイルが見つからない、または無効なフォーマットなどの潜在的なエラーをキャッチして処理し、アプリケーションの安定性を確保します。

なぜ例外処理においてfinallyブロックが重要なのでしょうか?

finallyブロックは、例外が投げられたかどうかに関わらず、特定のコードが実行されることを保証するため重要です。これは、ファイルストリームやデータベース接続を閉じるなど、リソースの解放やクリーンアップ作業を行う上で特に有用です。

C#で複数のcatchブロックを使用する例を教えてくれますか?

はい、C#では異なる種類の例外を処理するために複数のcatchブロックを使用できます。たとえば、FileNotFoundExceptionを処理するためのcatchブロックと、FormatExceptionを処理するための別のcatchブロックを持つことができます。これにより、特定の例外タイプに合ったより正確なエラー処理が可能です。

IronPDFはC#の例外処理とどのように統合されていますか?

IronPDFは、HTMLをPDFに変換したり、PDFファイルからテキストを抽出したりする操作を行う際にtry-catchブロックを使用できるようにすることで、C#の例外処理と統合されています。この統合により、潜在的なエラーを管理し、アプリケーションの堅牢性を向上させます。

IronPDFを用いる際に遭遇する可能性のある一般的な例外は何ですか?

IronPDFを使用する際の一般的な例外には、ファイルパスが間違っている場合のFileNotFoundExceptionや、PDFコンテンツが正しくレンダリングされていない場合のInvalidOperationExceptionなどがあります。これらの例外をtry-catchブロックで処理することで、アプリケーションのクラッシュを防ぐことができます。

C#プロジェクトにIronPDFをインストールするにはどうすればよいですか?

C#プロジェクトにIronPDFをインストールするには、パッケージマネージャーコンソールでInstall-Package IronPdfというコマンドを使用するか、Visual Studioの「NuGetパッケージ管理」で'IronPDF'を検索します。これにより、プロジェクトに必要なライブラリ参照が追加されます。

catchブロックと例外フィルターの違いは何ですか?

catchブロックはtryブロック内で発生した例外を処理するために使用されるのに対し、例外フィルターは、catchブロックが実行される条件を指定することを可能にします。これはwhenキーワードを使用して行い、例外処理に対するより細かな制御を可能にします。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。