Specifieke uitzonderingen gebruiken in een catch-blok
Over het algemeen is het een goede programmeerpraktijk om een specifiek type uitzondering te ondervangen in plaats van een basisinstructie catch
te gebruiken.
Wanneer er een uitzondering optreedt, wordt deze doorgegeven aan de stack en krijgt elk catch-blok de mogelijkheid om het te verwerken. De volgorde van catch-instructies is belangrijk. Plaats catch-blokken die zijn gericht op specifieke uitzonderingen voordat een algemeen uitzonderingsvangblok of de compiler een fout kan veroorzaken. Het juiste catch-blok wordt bepaald door het type uitzondering te koppelen aan de naam van de uitzondering die is opgegeven in het catch-blok. Als er geen specifiek vangstblok is, wordt de uitzondering gevangen door een algemeen catch-blok, als er een bestaat.
In het volgende codevoorbeeld wordt een blok gebruikt om een try
/catch
InvalidCastExceptionte vangen. In het voorbeeld wordt een klasse gemaakt die wordt aangeroepen Employee
met één eigenschap, werknemerniveau (Emlevel
). Met een methode, PromoteEmployee
wordt een object gebruikt en wordt het niveau van de werknemer verhoogd. Er InvalidCastException treedt een op wanneer een DateTime exemplaar wordt doorgegeven aan de PromoteEmployee
methode.
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;
}
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