Poniższe przykłady kodu stanowią kontekst mojego pytania.
Klasa pokoju jest inicjowana przez delegata. W pierwszej implementacji klasy Room nie ma strażników przed delegatami, którzy zgłaszają wyjątki. Takie wyjątki zostaną przeniesione do właściwości North, gdzie delegowany jest oceniany (uwaga: metoda Main () pokazuje, jak instancja Room jest używana w kodzie klienta):
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
}
}
Ponieważ wolałbym raczej nie tworzyć obiektu, niż czytając właściwość North, zmieniam konstruktor na prywatny i wprowadzam statyczną metodę fabryczną o nazwie Create (). Ta metoda przechwytuje wyjątek zgłoszony przez delegata i zgłasza wyjątek opakowania, mając znaczący komunikat o wyjątku:
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;
}
}
Czy blok try-catch sprawia, że metoda Create () jest zanieczyszczona?
Create
jest również nieczysty, ponieważ ją wywołuje.
Create
funkcja nie chroni Cię przed uzyskaniem wyjątku podczas uzyskiwania nieruchomości. Jeśli twój delegat rzuca, w prawdziwym życiu jest bardzo prawdopodobne, że zostanie rzucony tylko pod pewnymi warunkami. Istnieje prawdopodobieństwo, że warunki do rzucania nie są obecne podczas budowy, ale występują przy zdobyciu nieruchomości.