ตัวอย่างโค้ดต่อไปนี้ให้บริบทกับคำถามของฉัน
คลาสของห้องพักถูกเตรียมใช้งานด้วยผู้รับมอบสิทธิ์ ในการดำเนินการครั้งแรกของคลาสห้องไม่มีผู้คุมที่ได้รับมอบหมายที่โยนข้อยกเว้น ข้อยกเว้นดังกล่าวจะทำให้เกิดฟองขึ้นไปยังสถานที่ให้บริการภาคเหนือซึ่งมีการประเมินผู้ได้รับมอบหมาย (หมายเหตุ: วิธีการหลัก () แสดงให้เห็นถึงวิธีการที่อินสแตนซ์ของห้องพักจะใช้ในรหัสลูกค้า):
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
}
}
เนื่องจากว่าฉันค่อนข้างล้มเหลวในการสร้างวัตถุมากกว่าเมื่ออ่านคุณสมบัตินอร์ทฉันเปลี่ยนคอนสตรัคเตอร์ให้เป็นแบบส่วนตัวและแนะนำวิธีการสร้างแบบสแตติกจากโรงงานชื่อ Create () วิธีการนี้จับข้อยกเว้นที่ส่งโดยผู้รับมอบสิทธิ์และส่งข้อยกเว้น wrapper โดยมีข้อความข้อยกเว้นที่มีความหมาย:
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 แสดงวิธีสร้าง () ไม่บริสุทธิ์หรือไม่
Create
ก็ไม่บริสุทธิ์เช่นกันเพราะมันเรียกว่า
Create
ฟังก์ชั่นของคุณไม่ได้ป้องกันคุณจากการได้รับข้อยกเว้นเมื่อได้รับทรัพย์สิน หากตัวแทนของคุณโยนในชีวิตจริงมีโอกาสมากที่มันจะถูกโยนภายใต้เงื่อนไขบางอย่างเท่านั้น โอกาสที่เงื่อนไขสำหรับการขว้างปาจะไม่ปรากฏในระหว่างการก่อสร้าง แต่จะปรากฏเมื่อรับทรัพย์สิน