Embarcadero Delphi
प्रयास का उपयोग, को छोड़कर, और अंत में
खोज…
वाक्य - विन्यास
कोशिश करो-छोड़कर: कोशिश करो [बयानों को छोड़कर] [[[E: ExceptionType do statement]] [बाकी बयान] | [कथन] अंत;
अंत में कोशिश करें: कोशिश करें [बयान] अंत में [बयान] अंत;
मेमोरी लीक से बचने के लिए सरल प्रयास..बस उदाहरण
उपयोग की try
- finally
में लीक संसाधनों (जैसे स्मृति) से बचने के मामले में निष्पादन के दौरान एक अपवाद होता है।
नीचे दी गई प्रक्रिया एक फ़ाइल में एक स्ट्रिंग को बचाता है और TStringList
को लीक होने से रोकता है।
procedure SaveStringToFile(const aFilename: TFilename; const aString: string);
var
SL: TStringList;
begin
SL := TStringList.Create; // call outside the try
try
SL.Text := aString;
SL.SaveToFile(aFilename);
finally
SL.Free // will be called no matter what happens above
end;
end;
भले ही फ़ाइल को सहेजते समय कोई अपवाद उत्पन्न होता है, SL
को मुक्त किया जाएगा। कोई भी अपवाद कॉल करने वाले के पास जाएगा।
एक नई वस्तु की अपवाद-सुरक्षित वापसी
जब कोई फ़ंक्शन ऑब्जेक्ट लौटाता है (जैसा कि कॉलर द्वारा पास किया गया है) का उपयोग करने का विरोध करता है, तो सावधान रहें एक अपवाद लीक होने का कारण नहीं बनता है।
function MakeStrings: TStrings;
begin
// Create a new object before entering the try-block.
Result := TStringList.Create;
try
// Execute code that uses the new object and prepares it for the caller.
Result.Add('One');
MightThrow;
except
// If execution reaches this point, then an exception has occurred. We cannot
// know how to handle all possible exceptions, so we merely clean up the resources
// allocated by this function and then re-raise the exception so the caller can
// choose what to do with it.
Result.Free;
raise;
end;
// If execution reaches this point, then no exception has occurred, so the
// function will return Result normally.
end;
Naive प्रोग्रामर सभी अपवाद प्रकारों को पकड़ने और इस तरह के फ़ंक्शन से nil
वापस करने का प्रयास कर सकते हैं, लेकिन यह सभी अपवाद प्रकारों को पकड़ने के बिना सामान्य हतोत्साहित अभ्यास का एक विशेष मामला है।
कोशिश-अंत के अंदर नेस्टेड-नेस्ट
एक try
- finally
एक try
अंदर नेस्टेड किया जा सकता है - ब्लॉक except
।
try
AcquireResources;
try
UseResource;
finally
ReleaseResource;
end;
except
on E: EResourceUsageError do begin
HandleResourceErrors;
end;
end;
यदि कोई अपवाद UseResource
अंदर होता है, तो निष्पादन ReleaseResource
कूद जाएगा। यदि अपवाद एक EResourceUsageError
, तो निष्पादन अपवाद हैंडलर के लिए कूद जाएगा और HandleResourceErrors
कॉल HandleResourceErrors
। किसी भी अन्य प्रकार के अपवाद अपवाद हैंडलर को ऊपर छोड़ देंगे और अगले try
तक बुलबुला करेंगे - कॉल स्टैक except
ब्लॉक करने के except
।
में अपवाद AcquireResource
या ReleaseResource
निष्पादन अपवाद संचालक पर जाने के लिए, लंघन का कारण होगा finally
ब्लॉक, क्योंकि या तो इसी try
ब्लॉक अभी तक दर्ज नहीं किया गया है या क्योंकि finally
ब्लॉक पहले से ही दर्ज किया गया है।
कोशिश-अंत के अंदर नेस्टेड को छोड़कर
एक try
- ब्लॉक को except
एक try
अंदर नेस्टेड किया जा सकता है - finally
ब्लॉक।
AcquireResource;
try
UseResource1;
try
UseResource2;
except
on E: EResourceUsageError do begin
HandleResourceErrors;
end;
end;
UseResource3;
finally
ReleaseResource;
end;
एक तो EResourceUsageError
में होता है UseResource2
, तो निष्पादन अपवाद संचालक के लिए कूद और कॉल करेंगे HandleResourceError
। अपवाद को संभाला जाएगा, इसलिए निष्पादन का उपयोग UseResource3
और उसके बाद जारी रहेगा ReleaseResource
।
यदि कोई अन्य प्रकार का अपवाद UseResource2
में होता है, तो यहां अपवाद हैंडलर शो लागू नहीं होगा, इसलिए निष्पादन UseResource3
कॉल पर कूद जाएगा और finally
सीधे ब्लॉक पर जाएगा, जहां ReleaseResource
कहा जाएगा। उसके बाद, निष्पादन अगले लागू अपवाद हैंडलर पर कूद जाएगा क्योंकि कॉल स्टैक अप अपवाद बुलबुले।
यदि उपरोक्त उदाहरण में किसी अन्य कॉल में अपवाद होता है, तो HandleResourceErrors
नहीं कहा जाएगा। ऐसा इसलिए है क्योंकि उस अपवाद हैंडलर के अनुरूप try
ब्लॉक के अंदर कोई भी अन्य कॉल नहीं होती है।
2 या अधिक वस्तुओं के साथ अंत में कोशिश करें
Object1 := nil;
Object2 := nil;
try
Object1 := TMyObject.Create;
Object2 := TMyObject.Create;
finally
Object1.Free;
Object2.Free;
end;
यदि आप try-finally
ब्लॉक के बाहर nil
साथ वस्तुओं को इनिशियलाइज़ नहीं करते हैं, यदि उनमें से एक बनाने में विफल रहता है तो एवी अंत में ब्लॉक पर होगा, क्योंकि ऑब्जेक्ट शून्य नहीं होगा (जैसा कि इसे आरंभीकृत नहीं किया गया था)। एक अपवाद का कारण होगा।
यदि ऑब्जेक्ट शून्य है, तो Free
विधि की जांच करता है, इसलिए दोनों ऑब्जेक्ट्स को nil
साथ आरंभीकृत करने पर त्रुटियों से बचा जाता है यदि उन्हें बनाया नहीं गया था।