เอาล่ะนี่เป็นเรื่องง่าย:
อะไรคือความแตกต่างระหว่าง
Application.ThreadException
และAppDomain.CurrentDomain.UnhandledException
?ฉันจำเป็นต้องจัดการทั้งสองอย่างหรือไม่?
ขอบคุณ!
เอาล่ะนี่เป็นเรื่องง่าย:
อะไรคือความแตกต่างระหว่างApplication.ThreadException
และAppDomain.CurrentDomain.UnhandledException
?
ฉันจำเป็นต้องจัดการทั้งสองอย่างหรือไม่?
ขอบคุณ!
คำตอบ:
Application.ThreadException เฉพาะสำหรับ Windows Forms Winforms เรียกใช้ตัวจัดการเหตุการณ์เพื่อตอบสนองต่อข้อความที่ Windows ส่งมา ตัวอย่างเช่นเหตุการณ์คลิกฉันแน่ใจว่าคุณรู้จักพวกเขา หากตัวจัดการเหตุการณ์ดังกล่าวแสดงข้อยกเว้นแสดงว่ามีแบ็คสต็อปภายในลูปข้อความ Winforms ที่จับข้อยกเว้นนั้น
backstop นั้นทำให้เหตุการณ์Application.ThreadExceptionเริ่มทำงาน หากคุณไม่ได้แทนที่ผู้ใช้จะได้รับThreadExceptionDialog ซึ่งทำให้เขาไม่สนใจข้อยกเว้นและเรียกใช้โปรแกรมของคุณต่อไป ไม่ใช่ความคิดที่ดี btw.
คุณสามารถปิดใช้งานพฤติกรรมนี้ได้โดยเรียกApplication.SetUnhandledExceptionMode ()ในเมธอด Main () ใน Program.cs หากไม่มี backstop นั้นสิ่งปกติจะเกิดขึ้นเมื่อเธรดตายจากข้อยกเว้นที่ไม่สามารถจัดการได้: AppDomain.UnhandledException จะเริ่มทำงานและโปรแกรมจะหยุดทำงาน
Fwiw: "ThreadException" เป็นตัวเลือกชื่อที่แย่มาก ไม่มีอะไรเกี่ยวข้องกับเธรด
จากแหล่งที่มา :
ในแอปพลิเคชันที่ใช้ Windows Forms ข้อยกเว้นที่ไม่ได้จัดการในเธรดแอ็พพลิเคชันหลักจะทำให้เกิด
Application.ThreadException
เหตุการณ์ขึ้น หากเหตุการณ์นี้ได้รับการจัดการลักษณะการทำงานเริ่มต้นคือข้อยกเว้นที่ไม่สามารถจัดการได้จะไม่ยุติแอปพลิเคชันแม้ว่าแอปพลิเคชันจะอยู่ในสถานะที่ไม่รู้จัก ในกรณีนั้นUnhandledException
เหตุการณ์จะไม่เกิดขึ้น พฤติกรรมนี้สามารถเปลี่ยนแปลงได้โดยใช้ไฟล์คอนฟิกูเรชันแอ็พพลิเคชันหรือโดยใช้Application.SetUnhandledExceptionMode
วิธีการเปลี่ยนโหมดUnhandledExceptionMode.ThrowException
ก่อนที่ThreadException
ตัวจัดการเหตุการณ์จะเชื่อมต่อ ใช้กับเธรดแอปพลิเคชันหลักเท่านั้นUnhandledException
เหตุการณ์ถูกยกขึ้นเพื่อจัดการข้อยกเว้นโยนในหัวข้ออื่น ๆเริ่มต้นด้วยVisual Studio 2005ที่Visual Basicกรอบใบสมัครให้เหตุการณ์อื่นสำหรับข้อยกเว้นที่ไม่สามารถจัดการในหัวข้อการประยุกต์ใช้หลัก
WindowsFormsApplicationBase.UnhandledException
- เหตุการณ์นี้มีอ็อบเจ็กต์อาร์กิวเมนต์เหตุการณ์ที่มีชื่อเดียวกันกับอ็อบเจ็กต์อาร์กิวเมนต์เหตุการณ์ที่ใช้โดย AppDomain.UnhandledException แต่มีคุณสมบัติต่างกัน โดยเฉพาะอย่างยิ่งอ็อบเจ็กต์อาร์กิวเมนต์เหตุการณ์นี้มีExitApplication
คุณสมบัติที่อนุญาตให้แอปพลิเคชันทำงานต่อไปโดยไม่สนใจข้อยกเว้นที่ไม่สามารถจัดการได้ (และออกจากแอปพลิเคชันในสถานะที่ไม่รู้จัก) ในกรณีนั้นเหตุการณ์ AppDomain.UnhandledException จะไม่ถูกยกขึ้น
Application.ThreadException
สามารถจับได้และแอปพลิเคชันสามารถดำเนินการต่อได้ (โดยทั่วไปไม่ใช่ความคิดที่ดี แต่สำหรับแอปพลิเคชันเช่นการเรียกใช้การดำเนินการบางอย่างเป็นระยะ ๆ นี่เป็นทางออกที่ดี)
ในการตรวจจับข้อยกเว้นที่เกิดขึ้นในเธรดที่ไม่ได้สร้างและเป็นเจ้าของโดย Windows Forms ให้ใช้ไฟล์AppDomain.UnhandledException
. อนุญาตให้แอปพลิเคชันบันทึกข้อมูลเกี่ยวกับข้อยกเว้นก่อนที่ตัวจัดการเริ่มต้นของระบบจะรายงานข้อยกเว้นไปยังผู้ใช้และยุติแอปพลิเคชัน
การจัดการข้อยกเว้นนี้ไม่ได้ป้องกันไม่ให้แอปพลิเคชันถูกยกเลิก
สูงสุดที่สามารถทำได้ (ข้อมูลโปรแกรมอาจเสียหายเมื่อไม่มีการจัดการข้อยกเว้น) คือการบันทึกข้อมูลโปรแกรมเพื่อการกู้คืนในภายหลัง หลังจากนั้นโดเมนของแอปพลิเคชันจะถูกยกเลิกการโหลดและแอปพลิเคชันจะสิ้นสุดลง
เริ่มต้นด้วย. NET 4เหตุการณ์นี้จะไม่ถูกยกขึ้นสำหรับข้อยกเว้นที่ทำให้สถานะของกระบวนการเสียหายเช่นสแต็กล้นหรือการละเมิดการเข้าถึงเว้นแต่ว่าตัวจัดการเหตุการณ์จะมีความสำคัญด้านความปลอดภัยและมี
HandleProcessCorruptedStateExceptionsAttribute
แอตทริบิวต์
ตกลง - ฉันมีมันต่อหน้าฉันบิตของรหัสนี้จากmsdnค่อนข้างอธิบายตัวเองได้:
public static void Main(string[] args)
{
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new
ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
// Set the unhandled exception mode to force all Windows Forms
// errors to go through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
// Runs the application.
Application.Run(new ErrorHandlerForm());
}
สิ่งนั้นคือThreadException
เกิดขึ้นเนื่องจากปัญหากับเธรดของคุณการทำงานUnhandled Exception
จะเริ่มทำงานหากรหัสของคุณแสดงข้อยกเว้นที่ไม่ได้รับการจัดการ
วิธีที่ง่ายในการทำให้เกิดข้อที่สองคือการสร้างแอปโดยไม่ต้องพยายาม ... จับบล็อกและโยนข้อยกเว้น
ตอนนี้หากคุณต้องการประกันคุณสามารถจัดการได้ทั้งสองอย่างอย่างไรก็ตามหากคุณจับและจัดการexceptions
ได้อย่างถูกต้องคุณก็ไม่จำเป็นต้องใช้UnhandledException
ตัวจัดการเพราะมันเหมือนกับการจับทั้งหมด
Application.ThreadException
. ฉันตั้งคำถามเกี่ยวกับเรื่องนี้[ที่นี่ ] พร้อมกับรหัส C # ขนาดเล็กของฉัน