खोज…


वाक्य - विन्यास

  1. कोशिश करो-छोड़कर: कोशिश करो [बयानों को छोड़कर] [[[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 साथ आरंभीकृत करने पर त्रुटियों से बचा जाता है यदि उन्हें बनाया नहीं गया था।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow