Die folgenden Codebeispiele bieten Kontext zu meiner Frage.
Die Raumklasse wird mit einem Delegaten initialisiert. In der ersten Implementierung der Room-Klasse gibt es keine Schutzmaßnahmen gegen Delegierte, die Ausnahmen auslösen. Solche Ausnahmen sprudeln in die Eigenschaft North, in der der Delegat ausgewertet wird (Hinweis: Die Methode Main () zeigt, wie eine Room-Instanz im Clientcode verwendet wird):
public sealed class Room
{
private readonly Func<Room> north;
public Room(Func<Room> north)
{
this.north = north;
}
public Room North
{
get
{
return this.north();
}
}
public static void Main(string[] args)
{
Func<Room> evilDelegate = () => { throw new Exception(); };
var kitchen = new Room(north: evilDelegate);
var room = kitchen.North; //<----this will throw
}
}
Da ich lieber bei der Objekterstellung als beim Lesen der Eigenschaft North versagen möchte, ändere ich den Konstruktor in private und führe eine statische Factory-Methode mit dem Namen Create () ein. Diese Methode fängt die vom Delegaten ausgelöste Ausnahme ab und löst eine Wrapper-Ausnahme mit einer aussagekräftigen Ausnahmemeldung aus:
public sealed class Room
{
private readonly Func<Room> north;
private Room(Func<Room> north)
{
this.north = north;
}
public Room North
{
get
{
return this.north();
}
}
public static Room Create(Func<Room> north)
{
try
{
north?.Invoke();
}
catch (Exception e)
{
throw new Exception(
message: "Initialized with an evil delegate!", innerException: e);
}
return new Room(north);
}
public static void Main(string[] args)
{
Func<Room> evilDelegate = () => { throw new Exception(); };
var kitchen = Room.Create(north: evilDelegate); //<----this will throw
var room = kitchen.North;
}
}
Verunreinigt der Try-Catch-Block die Create () -Methode?
Create
ist, ist er auch unrein, weil er sie aufruft.
Create
Funktion schützt Sie nicht vor einer Ausnahme beim Abrufen der Eigenschaft. Wenn Ihr Delegierter wirft, ist es im wirklichen Leben sehr wahrscheinlich, dass er nur unter bestimmten Bedingungen wirft. Es besteht die Möglichkeit, dass die Bedingungen für das Werfen während des Baus nicht gegeben sind, aber sie sind vorhanden, wenn das Eigentum erhalten wird.