如何在 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. 该示例创建了一个名为 Employee 的类,其具有单一属性,雇员级别为 (Emlevel)。The 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. DateTime 实例传递给 PromoteEmployee 方法时,InvalidCastException 发生。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