如何使用 Catch 區塊中的特定例外狀況How to use specific exceptions in a catch block

一般而言,比起使用基本 catch 陳述式,攔截特定例外狀況類型會是更佳的程式設計做法。In general, it's good programming practice to catch a specific type of exception rather than use a basic catch statement.

發生例外狀況時,該例外狀況會在堆疊中向上傳遞,讓每個 catch 區塊都有機會處理。When an exception occurs, it is passed up the stack and each catch block is given the opportunity to handle it. Catch 陳述式的順序很重要。The order of catch statements is important. 請將針對特定例外狀況的 catch 區塊放在一般例外狀況的 catch 區塊之前,否則編譯器可能會發出錯誤。Put catch blocks targeted to specific exceptions before a general exception catch block or the compiler might issue an error. 藉由比對 catch 區塊中指定的例外狀況類型與例外狀況名稱,即可決定正確的 catch 區塊。The proper catch block is determined by matching the type of the exception to the name of the exception specified in the catch block. 如果沒有特定 catch 區塊,則會由一般 catch 區塊 (如果有的話) 攔截例外狀況。If there is no specific catch block, the exception is caught by a general catch block, if one exists.

下列程式碼範例使用 try/catch 區塊來攔截 InvalidCastExceptionThe following code example uses a try/catch block to catch an InvalidCastException. 此範例會建立具有員工層級 (Emlevel) 之單一屬性的類別,稱為 EmployeeThe sample creates a class called Employee with a single property, employee level (Emlevel). PromoteEmployee 方法會採用一個物件並遞增員工層級。A method, PromoteEmployee, takes an object and increments the employee level. InvalidCastException 會在 DateTime 執行個體傳遞給 PromoteEmployee 方法時發生。An InvalidCastException occurs when a DateTime instance is passed to the PromoteEmployee method.

using namespace System;

public ref class Employee
{
public:
    Employee()
    {
        emlevel = 0;
    }

    //Create employee level property.
    property int Emlevel
    {
        int get()
        {
            return emlevel;
        }
        void set(int value)
        {
            emlevel = value;
        }
    }

private:
    int emlevel;
};

public ref class Ex13
{
public:
    static void PromoteEmployee(Object^ emp)
    {
        //Cast object to Employee.
        Employee^ e = (Employee^) emp;
        // Increment employee level.
        e->Emlevel++;
    }

    static void Main()
    {
        try
        {
            Object^ o = gcnew Employee();
            DateTime^ newyears = gcnew DateTime(2001, 1, 1);
            //Promote the new employee.
            PromoteEmployee(o);
            //Promote DateTime; results in InvalidCastException as newyears is not an employee instance.
            PromoteEmployee(newyears);
        }
        catch (InvalidCastException^ e)
        {
            Console::WriteLine("Error passing data to PromoteEmployee method. " + e->Message);
        }
    }
};

int main()
{
    Ex13::Main();
}
using System;

public class Employee
{
    //Create employee level property.
    public int Emlevel
    {
        get
        {
            return(emlevel);
        }
        set
        {
            emlevel = value;
        }
    }

    private int emlevel = 0;
}

public class Ex13
{
    public static void PromoteEmployee(Object emp)
    {
        // Cast object to Employee.
        var e = (Employee) emp;
        // Increment employee level.
        e.Emlevel = e.Emlevel + 1;
    }

    public static void Main()
    {
        try
        {
            Object o = new Employee();
            DateTime newYears = new DateTime(2001, 1, 1);
            // Promote the new employee.
            PromoteEmployee(o);
            // Promote DateTime; results in InvalidCastException as newYears is not an employee instance.
            PromoteEmployee(newYears);
        }
        catch (InvalidCastException e)
        {
            Console.WriteLine("Error passing data to PromoteEmployee method. " + e.Message);
        }
    }
}
Public Class Employee
    'Create employee level property.
    Public Property Emlevel As Integer
        Get
            Return emlevelValue
        End Get
        Set
            emlevelValue = Value
        End Set
    End Property

    Private emlevelValue As Integer = 0
End Class

Public Class Ex13
    Public Shared Sub PromoteEmployee(emp As Object)
        ' Cast object to Employee.
        Dim e As Employee = CType(emp, Employee)
        ' Increment employee level.
        e.Emlevel = e.Emlevel + 1
    End Sub

    Public Shared Sub Main()
        Try
            Dim o As Object = New Employee()
            Dim newYears As New DateTime(2001, 1, 1)
            ' Promote the new employee.
            PromoteEmployee(o)
            ' Promote DateTime; results in InvalidCastException as newYears is not an employee instance.
            PromoteEmployee(newYears)
        Catch e As InvalidCastException
            Console.WriteLine("Error passing data to PromoteEmployee method. " + e.Message)
        End Try
    End Sub
End Class

另請參閱See also