ประวัติการอัพเดต: หมายเลข 2
เวลาอัปเดต: 21-10-2544 02:42 น
อัปเดตโดย: Musicwind®
หมายเหตุการอัปเดต: รูปแบบที่แก้ไข
ประวัติการอัพเดต: หมายเลข 1
เวลาอัปเดต: 19-10-2544 21:15 น
อัปเดตโดย: Musicwind®
หมายเหตุการอัปเดต: สร้างแล้ว
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~
คำนำ: ฉันหมกมุ่นอยู่กับ Delphi มานานกว่าสามปีแล้ว แต่ทุกครั้งที่ฉันอ่าน เอกสารช่วยเหลือของ Delphi ฉันยังคงได้รับอะไรมากมาย ดังนั้นฉันจึงอดไม่ได้ที่จะถอนหายใจว่า Delphi นั้นกว้างแค่ไหน! แม้ว่าฉันรู้สึกละอายใจ ฉันจะแยกแยะประสบการณ์และสิ่งที่ฉันได้รับ และแบ่งปันกำลังใจกับพวกคุณที่หยิ่งผยองและมีความรู้น้อยเหมือนฉัน
1. ข้อยกเว้นแบบเงียบคืออะไร? (ทำไมไม่ Silence of the Lambs? ;- ))
ข้อยกเว้นแบบไม่มีการโต้ตอบ นั่นคือ Slient Exceptions อ้างถึงประเภทข้อยกเว้นที่ไม่ทำให้เกิดข้อความแจ้งที่น่ารำคาญตามค่าเริ่มต้น: EAbort ใน Object Pascal คลาสข้อยกเว้น EAbort คือคลาสบรรพบุรุษของคลาสข้อยกเว้นแบบไม่ต้องโต้ตอบทั้งหมด (และ EAbort สืบทอดข้อยกเว้น) การเพิ่ม EAbort จะทำให้โมดูลการดำเนินการหยุดจนกว่าโมดูลการจัดการข้อยกเว้นภายนอกสุดจะขัดขวาง แต่จะไม่ทำให้กล่องข้อความที่มีเครื่องหมายหยุดสีแดงปรากฏขึ้น อ้างถึงรหัสต่อไปนี้:
พยายาม
ShowMessage('Hello1');
Raise EAbort.Create('ยกเลิก');
ShowMessage('Hello2');
ยกเว้น
บน E: ข้อยกเว้นทำ
showmessage('ยกเว้น');
จบ;
ผลการดำเนินการจะแสดงกล่องข้อความสองกล่อง กล่องหนึ่งคือ "Hello1" และอีกกล่องคือ "ในข้อยกเว้น" นี่แสดงว่า EAbort ทำงานได้ เนื่องจากข้ามคำสั่ง "ShowMessage('Hello2')" ในเวลาเดียวกัน กล่องข้อความ "Abort it" จะไม่ปรากฏขึ้น ซึ่งเป็นการยืนยันคุณสมบัติของคลาสข้อยกเว้น EAbort ที่ไม่มีกล่องโต้ตอบ กล่องปรากฏขึ้น (สิ่งนี้เป็นจริงในระหว่างการออกแบบ) และกล่องข้อความ "On Exception" ระบุว่าแม้ว่า EAbort อาจมีความผิดปกติที่แตกต่างจากข้อยกเว้นทั่วไป แต่ก็ไม่ได้ป้องกันเราไม่ให้ใช้คำสั่ง Try-Except แบบเก่าเพื่อตรวจจับมัน .
2. ทำไมต้องใช้ EAbort ?
EAbort มีประโยชน์ในบางสถานการณ์ ตัวอย่างเช่น เมื่อเราต้องการยุติการดำเนินการแต่ไม่ต้องการให้ผู้ใช้สังเกตเห็น (เราไม่ต้องการให้ผู้ใช้เห็นกล่องข้อความยกเว้นเริ่มต้น) แน่นอนว่าเพื่อให้บรรลุผลแบบเดียวกัน คุณยังสามารถใช้ข้อยกเว้นทั่วไปได้ (เช่น ใช้รูปแบบประโยค Try-Except ใส่โค้ดในส่วน Try เพิ่มข้อยกเว้นหากคุณต้องการยุติการดำเนินการ และอย่าเขียน รหัสใดๆ ในส่วนยกเว้น) แต่ไม่มีสิ่งใดที่ง่ายและตรงไปตรงมาเท่ากับการใช้ EAbort
3. มีอะไรที่ง่ายกว่านี้อีกไหม? --การใช้ กระบวนการ ยกเลิก
การยกเลิก ซึ่งเป็นกระบวนการที่กำหนดในหน่วย SysUtils ช่วยให้เราใช้ EAbort ได้อย่างสะดวก ดูซอร์สโค้ดการใช้งานของ Abort:
ขั้นตอนการยกเลิก;
ฟังก์ชั่น ReturnAddr: ตัวชี้;
asm
MOV EAX,[EBP + 4]
จบ;
เริ่ม
เพิ่ม EAbort.Create (SOperationAborted) ที่ ReturnAddr;
จบ;
SOperationAborted ที่นี่มักจะเป็น "Operation aborted"
4. ยกม่าน - หลักการปฏิบัติ
บางทีคุณอาจสงสัยว่าทำไม EAbort ถึงเงียบเหมือนฉัน Delphi ทำอะไรกับ EAbort ภายในบ้าง มาหาคำตอบกัน
เปิดโปรเจ็กต์ใหม่ คลิกค้นหาในไฟล์ ป้อนคำสำคัญ "EAbort" จากนั้นเลือกปุ่มตัวเลือกค้นหาในไดเรกทอรี และตั้งค่ากล่องแก้ไขรูปแบบไฟล์ในตัวเลือกไดเรกทอรีการค้นหาเป็นชื่อไดเรกทอรีที่มีซอร์สโค้ด Delphi ตั้งอยู่ (เช่น เป็นของฉันใช่: D:Program FilesBorlandDelphi6Source) และอย่าลืมตรวจสอบรวมไดเรกทอรีย่อย สุดท้ายคลิก "ตกลง" เพื่อเริ่มการค้นหา
เป็นผลให้เราพบว่ามีมากถึง 17 ตำแหน่งในซอร์สโค้ด Delphi ที่เกี่ยวข้องกับ EAbort ยกเว้นการประกาศ EAbort สองครั้งและข้อความแสดงความคิดเห็นบางส่วนในหน่วย Sysutils เราพบว่าโค้ดส่วนใหญ่คล้ายกับ:
ถ้า ExceptObject เป็น EAbort แล้ว
เช่นเดียวกับ:
ถ้าไม่ (E คือ EAbort) แล้ว
ฯลฯ
พวกเขาทั้งหมดได้รับการดูแลเป็นพิเศษสำหรับ EAbort ที่ใช้ RTTI - ปรากฎว่าการใช้งาน EAbort นั้นง่ายมาก!
สองหน่วยที่ควรค่าแก่ความสนใจคือ: แบบฟอร์ม (เวอร์ชัน Linux คือ QForms) และ AppEvnts การค้นหาคำตอบสำหรับคำถามในโค้ดของอดีตนั้นง่ายกว่า ดูซอร์สโค้ด Delphi:
ขั้นตอน Tapplication.HandleException (ผู้ส่ง: TObject);
เริ่ม
ถ้า GetCapture <> 0 แล้ว SendMessage (GetCapture, WM_CANCELMODE, 0, 0);
ถ้ายกเว้นObjectเป็นข้อยกเว้นแล้ว
เริ่ม
ถ้าไม่ใช่ (ExceptObject คือ EAbort) แล้ว
ถ้าได้รับมอบหมาย (FOnException) แล้ว
FOnException (ผู้ส่ง ข้อยกเว้น (ExceptObject))
อื่น
ShowException (ข้อยกเว้น (ยกเว้นวัตถุ));
จบอย่างอื่น
SysUtils.ShowException(ExceptObject, ยกเว้นAddr);
จบ;
5. ความแตกต่างระหว่าง Abort , Break และ Exit
การยกเลิก การหยุด และการออก ค่อนข้างคล้ายกันแต่แตกต่างกันมาก ตัวแบ่ง ใช้เพื่อแยกออกจากลูปในคำสั่งลูป Exit ใช้เพื่อข้ามออกจากเนื้อหาของฟังก์ชันที่กำลังดำเนินการอยู่ (หรือเนื้อหาของกระบวนการ) การยกเลิกช่วยให้คุณสามารถกระโดดออกจากโค้ดตั้งแต่หนึ่งเลเยอร์ขึ้นไปได้จนกว่าโค้ดที่จับข้อยกเว้นจะจับได้
6. ปรับแต่งข้อยกเว้นแบบเงียบ
เช่นเดียวกับการประกาศคลาสย่อยของคลาสยกเว้นปกติ เพียงทำให้ EAbort และคลาสย่อยเป็นคลาสบรรพบุรุษ:
TMyException = คลาส (EAbort);
TNextException = คลาส (EAbort);
ฯลฯ
Musicwind®@HangZhou.Zhejiang.China
20-10-2544
บทความเพิ่มเติม
[ ท้ายบทความ]