Contoh kode berikut memberikan konteks untuk pertanyaan saya.
Kelas Kamar diinisialisasi dengan delegasi. Dalam implementasi pertama dari kelas Ruangan, tidak ada penjaga terhadap delegasi yang melempar pengecualian. Pengecualian seperti itu akan muncul ke properti North, di mana delegasi dievaluasi (catatan: Main () metode menunjukkan bagaimana instance Kamar digunakan dalam kode klien):
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
}
}
Menjadi bahwa saya lebih suka gagal pada pembuatan objek daripada ketika membaca properti Utara, saya mengubah konstruktor menjadi pribadi, dan memperkenalkan metode pabrik statis bernama Buat (). Metode ini menangkap pengecualian yang dilemparkan oleh delegasi, dan melemparkan pengecualian pembungkus, memiliki pesan pengecualian yang bermakna:
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;
}
}
Apakah blok try-catch membuat metode Create () tidak murni?
Create
juga tidak murni, karena ia memanggilnya.
Create
fungsi tidak melindungi Anda dari mendapatkan pengecualian ketika mendapatkan properti. Jika delegasi Anda melempar, dalam kehidupan nyata sangat mungkin bahwa itu akan dilemparkan hanya dalam beberapa kondisi. Kemungkinannya adalah kondisi untuk melempar tidak ada selama konstruksi, tetapi mereka ada saat mendapatkan properti.