다음 코드 예제는 내 질문에 대한 컨텍스트를 제공합니다.
Room 클래스는 대리자로 초기화됩니다. Room 클래스의 첫 번째 구현에서는 예외를 발생시키는 델리게이트에 대한 가드가 없습니다. 이러한 예외는 대리자가 평가되는 North 속성으로 버블 링됩니다 (주 : Main () 메서드는 클라이언트 코드에서 Room 인스턴스가 사용되는 방법을 보여줍니다).
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 속성을 읽을 때가 아니라 객체를 만들 때 오히려 실패하기 때문에 생성자를 private으로 변경하고 Create ()라는 정적 팩토리 메서드를 도입합니다. 이 메소드는 대리자가 던진 예외를 포착하고 의미있는 예외 메시지가있는 랩퍼 예외를 발생시킵니다.
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
경우 호출하기 때문에 불완전합니다.
Create
함수는 속성을 가져올 때 예외가 발생하지 않도록 보호하지 않습니다. 대리인이 실제 상황에서 던지면 일부 상황에서만 던질 가능성이 큽니다. 건설 중에 던지기 조건이 존재하지 않지만 재산을 얻을 때 존재하는 경우가 있습니다.