अच्छी तरह से मुझे उड़ाना! यह इतना गलत लग रहा था कि मुझे इसे खुद कोशिश करनी पड़ी, और तुम बिल्कुल सही हो! मैंने इसे इस तथ्य से कम कर दिया है कि यह एक ओएस अपवाद है (शून्य से विभाजित) जो ओएस द्वारा उत्पन्न होता है और डेल्फी द्वारा नहीं। यदि आप स्वयं को EIntError को आजमाते हैं और बढ़ाते हैं तो आपको अपेक्षित व्यवहार मिलता है, और जो आप ऊपर देखते हैं वह नहीं। ध्यान दें कि जब भी आप अपवाद उठाते हैं तो अपेक्षित व्यवहार होता है।
अद्यतन: System.pas इकाई में निम्न कोड जब अपवाद को फिर से उठाया है कहा जाता है:
{ Destroy any objects created for non-delphi exceptions }
MOV EAX,[EDX].TRaiseFrame.ExceptionRecord
AND [EAX].TExceptionRecord.ExceptionFlags,NOT cUnwinding
CMP [EAX].TExceptionRecord.ExceptionCode,cDelphiException
JE @@delphiException
MOV EAX,[EDX].TRaiseFrame.ExceptObject
CALL TObject.Free
CALL NotifyReRaise
तो अगर अपवाद एक डेल्फी अपवाद (इस मामले एक OS में नहीं है अपवाद) तो (संशोधित) "डेल्फी" अपवाद मुक्त हो गया है और मूल अपवाद फिर से उठाया गया है, जिससे अपवाद में किए गए किसी भी बदलाव को फेंक दिया गया है। मामला समाप्त!
अद्यतन 2: (स्वयं की सहायता नहीं कर सका)। आप इसे निम्नलिखित कोड से पुन: पेश कर सकते हैं:
type
TThreadNameInfo = record
InfoType: LongWord; // must be $00001000
NamePtr: PAnsiChar; // pointer to message (in user address space)
ThreadId: LongWord; // thread id ($ffffffff indicates caller thread)
Flags: LongWord; // reserved for future use, must be zero
end;
var
lThreadNameInfo: TThreadNameInfo;
with lThreadNameInfo do begin
InfoType := $00001000;
NamePtr := PAnsiChar(AnsiString('Division by zero'));
ThreadId := $ffffffff;
Flags := $00000000;
end;
RaiseException($C0000094, 0, sizeof(lThreadNameInfo) div sizeof(LongWord), @lThreadNameInfo);
मज़े करो!
धन्यवाद मिशा। मैंने सोचा कि मैं साजिश खो रहा था! शून्य द्वारा – Paul
डिवीजन ओएस अपवाद नहीं है। यह हार्डवेयर अपवाद है, जो सीपीयू द्वारा उठाया गया है (इस प्रकार, यह एसिंक अपवाद है)। ओएस और डेल्फी अपवाद दोनों सॉफ़्टवेयर अपवाद हैं, विशिष्ट कोड कॉल द्वारा उठाए गए हैं (इस प्रकार, यह सिंक अपवाद है)। इसलिए, प्रश्न में मुद्दा ओएस और डेल्फी अपवादों के बारे में नहीं है, लेकिन डेल्फी और गैर-डेल्फी अपवादों के बारे में है। "उठाना," मूल अपवाद को फिर से उठाता है (जो या तो हार्डवेयर या सॉफ़्टवेयर अपवाद हो सकता है), इसलिए डेल्फी ऑब्जेक्ट में कोई भी परिवर्तन केवल तभी संरक्षित किया जाएगा जब मूल अपवाद डेल्फी अपवाद था। यह काफी तार्किक है। – Alex