निम्नलिखित कोड उदाहरण मेरे प्रश्न का संदर्भ प्रदान करते हैं।
कक्ष वर्ग को एक प्रतिनिधि के साथ आरंभ किया जाता है। कक्ष वर्ग के पहले कार्यान्वयन में, अपवादों को फेंकने वाले प्रतिनिधियों के खिलाफ कोई गार्ड नहीं हैं। इस तरह के अपवाद उत्तर संपत्ति तक पहुंच जाएंगे, जहां प्रतिनिधि का मूल्यांकन किया जाता है (ध्यान दें: मुख्य () विधि दर्शाती है कि क्लाइंट कोड में एक कक्ष उदाहरण का उपयोग कैसे किया जाता है):
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 () नाम की एक स्थिर फैक्ट्री विधि का परिचय देता हूं। यह विधि प्रतिनिधि द्वारा फेंके गए अपवाद को पकड़ती है, और एक रैपर अपवाद को फेंक देती है, जिसमें एक सार्थक अपवाद संदेश होता है:
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;
}
}
कोशिश-पकड़ने ब्लॉक रेंडर () विधि अशुद्ध प्रस्तुत करता है?
Create
यह भी अशुद्ध है, क्योंकि यह इसे कॉल करता है।
Create
संपत्ति मिलने पर आपका कार्य आपको अपवाद होने से बचाता नहीं है। यदि आपके प्रतिनिधि को फेंक दिया जाता है, तो वास्तविक जीवन में यह बहुत संभावना है कि यह केवल कुछ शर्तों के तहत फेंक दिया जाएगा। संभावना है कि फेंकने की शर्तें निर्माण के दौरान मौजूद नहीं हैं, लेकिन वे संपत्ति प्राप्त करते समय मौजूद हैं।