Các ví dụ mã sau đây cung cấp ngữ cảnh cho câu hỏi của tôi.
Lớp phòng được khởi tạo với một đại biểu. Trong lần thực hiện đầu tiên của lớp Room, không có người bảo vệ chống lại các đại biểu ném ngoại lệ. Các ngoại lệ như vậy sẽ xuất hiện ở thuộc tính Bắc, nơi đại biểu được đánh giá (lưu ý: phương thức Main () biểu thị cách sử dụng một thể hiện của Phòng trong mã máy khách):
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
}
}
Vì tôi không muốn tạo ra đối tượng hơn là khi đọc thuộc tính North, tôi thay đổi hàm tạo thành riêng tư và giới thiệu một phương thức nhà máy tĩnh có tên là Tạo (). Phương thức này bắt ngoại lệ do đại biểu ném và ném ngoại lệ bao bọc, có một thông báo ngoại lệ có ý nghĩa:
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;
}
}
Khối thử bắt có làm cho phương thức Tạo () không trong sạch không?
Create
cũng không tinh khiết, vì nó gọi nó là hàm.
Create
Chức năng của bạn không bảo vệ bạn khỏi bị ngoại lệ khi nhận tài sản. Nếu đại biểu của bạn ném, trong cuộc sống thực, rất có khả năng nó sẽ chỉ ném trong một số điều kiện. Rất có thể là các điều kiện để ném không có mặt trong quá trình xây dựng, nhưng chúng có mặt khi nhận được tài sản.