一般而言,擷取特定類型的例外狀況,而不是使用基本 catch
語句是很好的程序設計做法。
發生異常時,它會在堆疊中向上傳遞,並且每個 catch 區塊都有機會來處理它。 catch 語句的順序很重要。 將適用特定例外狀況的 catch 區塊放在一般例外狀況 catch 區塊之前,否則編譯程式可能會發出錯誤訊息。 適當的 catch 區塊取決於將例外狀況的類型與 catch 區塊中指定的例外狀況名稱進行比對。 如果沒有特定的 catch 區塊,一般 catch 區塊會攔截例外狀況,如果有的話。
下列程式代碼範例會使用 try
/catch
區塊來擷取 InvalidCastException。 此範例會建立名為 Employee
且具有單一屬性員工層級 (Emlevel
) 的類別。 方法 PromoteEmployee
接收物件,並提升員工等級。 當 InvalidCastException 實體傳遞至 DateTime 方法時,就會發生 PromoteEmployee
。
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;
}
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