Aşağıdaki kod örnekleri sorumu bağlamı sağlar.
Room sınıfı bir temsilci ile başlatıldı. Room sınıfının ilk uygulamasında, delegelere istisnalar atan hiçbir muhafız yoktur. Bu istisnalar, delegenin değerlendirildiği Kuzey mülkünde kabarcıklı olacaktır (not: Main () yöntemi, bir Oda örneğinin müşteri kodunda nasıl kullanıldığını gösterir):
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
}
}
North özelliğini okurken kullanmak yerine nesne oluşturma konusunda başarısız olmayı tercih edersem, yapıcıyı özel olarak değiştiririm ve Create () adında statik bir fabrika yöntemi sunar. Bu yöntem, temsilcinin attığı istisnayı yakalar ve anlamlı bir istisna iletisine sahip bir sarmalayıcı istisnası atar:
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;
}
}
Try-catch bloğu Create () yönteminin zorlanmasına neden oluyor mu?
Create
da geçersizdir, çünkü onu çağırır.
Create
fonksiyon özelliğini alırken istisna almak sizi korumaz. Temsilciniz fırlatırsa, gerçek hayatta, sadece bazı şartlar altında fırlatılması muhtemeldir. Olasılıklar, atma koşullarının inşaat sırasında mevcut olmaması, ancak mülkiyeti alırken mevcut olmalarıdır.