跳至頁尾內容
開發者更新

Try/Catch in C#(開發者的工作原理)

如果您是C#程式設計的新手,您可能經常聽到"try catch"語句這個詞。 在本教程中,我們將深入探討異常處理的世界,重點關注catch塊,並探索如何使用try和catch語句使您的程式碼更能抵抗錯誤。 在過程中,我們將提供大量實際例子來幫助鞏固您的理解。

什麼是異常,以及為什麼要處理它們?

在C#中,異常表示程式運行時發生的一種事件,該事件會干擾程式執行指令的標準進程。 當異常發生時,程式的流程會被中斷,如果異常未被處理,程式將會突然終止。

異常處理是一種預測並管理這些干擾事件的方法,允許您的程式從意外問題中恢復並繼續按照預期運行。 通過使用try和catch塊,您可以確保您的程式碼優雅地處理錯誤,並向使用者提供有意義的反饋。

The Try Block

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 Block Catching Exceptions

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塊隨後處理異常,向使用者顯示一條消息。

Multiple Catch Blocks Handling Different Exceptions

有時,您的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塊時,請始終將它們排列為從最特定到最一般的異常型別。

Exception Filters Adding Conditions to Catch Blocks

異常過濾器允許您為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。 如果不滿足條件,則第二個catch塊將處理異常。

The Finally Block Ensures Code Execution

在某些情況下,您可能想要確保無論是否發生異常都要執行特定程式碼段。 為此,您可以使用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塊仍將被執行。

Custom Exceptions: Tailoring Exceptions to Your Needs

有時,您可能想要建立自己的自定義異常來處理程式碼中特定的異常。 為此,您可以建立一個從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: Integrating PDF Functionality with Exception Handling

了解更多關於IronPDF是一個流行的檔案庫,用於在C#中建立、編輯和提取PDF文件的內容。 在本節中,我們將探討如何將IronPDF與您的try-catch異常處理方法相結合,以優雅地處理潛在錯誤。

Installing IronPDF

首先,您需要安裝IronPDF NuGet套件。 您可以使用套件管理者控制台完成這項工作:

Install-Package IronPdf

或者,您可以在Visual Studio中的"管理NuGet套件"對話框中搜尋"IronPDF"。

Creating a PDF with IronPDF and Handling Exceptions

假設您想要從HTML字串建立PDF文件與IronPDF。 由於建立PDF的過程可能會引發異常,您可以使用try-catch塊來處理它們。 以下是一個使用IronPDF建立PDF和處理異常的範例:

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塊將處理錯誤,向使用者顯示相關的錯誤消息。

Extracting Text from a PDF and Handling Exceptions

您可能還想使用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

Try/Catch in C# (How It Works For Developers) Figure 1

在這個例子中,try塊包含了用於使用IronPDF提取PDF文字的程式碼。 如果在過程中發生異常,catch塊將處理錯誤,向使用者顯示相關消息。

結論

通過將IronPDF與您的try-catch異常處理方法結合使用,您可以建立能夠優雅地處理PDF文件錯誤的穩健應用程式。 這不僅提高了您應用程式的穩定性,還改善了整體使用者體驗。

請記住,當使用像IronPDF這樣的外部庫時,總是考慮潛在異常,並使用try和catch語句適當地處理它們。 這樣,您可以確保您的應用程式即使在處理意外問題時也能保持穩健且使用者友好。

IronPDF提供了一個免費試用其庫的機會,讓您能在不做出任何承諾的情況下探索其功能。 如果您在試用期後決定繼續使用IronPDF,授權費用從$999開始。

常見問題

C#中的try-catch區塊有什麼用途?

C#中的try-catch區塊用於處理程式執行過程中發生的異常。try區塊包含可能引發異常的程式碼,而catch區塊包含處理錯誤的程式碼,使程式能夠順利繼續運行。

在C#中處理PDF時,如何實施異常處理?

在C#中處理PDF時,您可以通過在涉及PDF建立或操作的操作周圍使用try-catch區塊來實施異常處理。這使您能夠捕獲並處理潛在的錯誤,例如文件未找到或格式無效,確保您的應用程式保持穩定。

為什麼在異常處理中使用finally區塊很重要?

finally塊很重要,因為它確保執行特定的程式碼,無論是否拋出異常。這對於釋放資源或執行清理任務(如關閉文件流或資料庫連接)特別有用。

您能提供一個在C#中使用多個catch塊的範例嗎?

是的,在C#中,您可以使用多個catch塊來處理不同型別的異常。例如,您可以有一個抓住 FileNotFoundException 的塊以及另一個處理 FormatException 的塊。這樣可以根據特定的異常型別進行更精確的錯誤處理。

IronPDF如何與C#中的異常處理整合?

IronPDF通過允許您在執行如將HTML轉換為PDF或提取PDF文件中的文字之類的操作時使用try catch塊來整合C#中的異常處理。這種整合有助於管理潛在的錯誤並增強您的應用程式的穩健性。

您在使用IronPDF時可能遇到的常見例外有哪些?

使用IronPDF時常見的異常可能包括如果文件路徑不正確則會出現FileNotFoundException,或者如果PDF內容未正確渲染則會出現 InvalidOperationException。使用try-catch塊處理這些異常可以防止應用程式崩潰。

如何安裝IronPDF以在C#專案中進行PDF處理?

要在C#專案中安裝IronPDF,請使用程式包管理器控制台上的命令Install-Package IronPdf或在Visual Studio的“管理NuGet程式包”對話框中搜尋“IronPDF”。這將為您的專案增加必要的庫引用。

catch塊和異常篩選器之間有什麼區別?

catch塊用於處理try區塊中發生的異常,而異常篩選器則允許您指定條件以決定catch塊應該執行的情況。這使用when關鍵字來實現,使得異常處理的控制更加具體。

Jacob Mellor,首席技術官 @ Team Iron
首席技術官

Jacob Mellor是Iron Software的首席技術官,一位在C# PDF技術上開創先河的遠見工程師。作為Iron Software核心程式碼庫的原開發者,他從創立以來就一直在塑造公司的產品架構,與首席執行官Cameron Rimington一起將公司轉變為服務於NASA、特斯拉和全球政府公司的50多名人員的公司。

Jacob擁有曼徹斯特大學的土木工程一等榮譽學士學位(BEng),於1998-2001年之間獲得。在1999年於倫敦創辦他的第一家軟體公司並於2005年建立了他的第一批.NET元組件後,他專注於解決Microsoft生態系統中的複雜問題。

他的旗艦IronPDF和Iron Suite .NET程式庫在全球獲得了超過3000萬次NuGet安裝依據,他的基礎程式碼基繼續支援著世界各地開發者使用的工具。擁有25年的商業經驗和41年的程式設計專業知識,他仍專注於推動企業級C#、Java和Python PDF技術的創新,同時指導下一代技術領導者。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話