“ ข้อยกเว้นโอกาสแรก” คืออะไร?


107

ข้อยกเว้นของโอกาสครั้งแรกคืออะไร? โปรแกรม. NET มีที่มาอย่างไรและที่ไหน? แล้วทำไมถึงเรียกด้วยชื่อแปลก ๆ (เรากำลังพูดถึง 'โอกาส' อะไร)

คำตอบ:


80

เป็นแนวคิดในการแก้ไขข้อบกพร่อง โดยทั่วไปข้อยกเว้นจะถูกโยนไปที่ดีบักเกอร์ก่อนจากนั้นไปยังโปรแกรมจริงซึ่งหากไม่ได้รับการจัดการมันจะถูกโยนไปที่ดีบักเกอร์เป็นครั้งที่สองทำให้คุณมีโอกาสทำอะไรกับมันใน IDE ของคุณก่อนและหลังแอปพลิเคชันนั้นเอง สิ่งนี้ดูเหมือนจะเป็นสิ่งประดิษฐ์ของ Microsoft Visual Studio


21
มันเป็นมากกว่าแนวคิดการดีบั๊ก C # ไม่ได้ให้วิธีการที่สะดวกในการสังเกตการจัดการข้อยกเว้นสองรอบในเวลาทำงาน แต่ vb.net ทำ โดยทั่วไปเมื่อเกิดข้อยกเว้นรันไทม์จะเริ่มต้นด้วยการค้นหากลุ่มการโทรเพื่อดูว่าใครจะจับได้ กระบวนการนั้นจะเกิดขึ้นก่อนที่finallyบล็อกใด ๆจะทำงาน เมื่อระบบตัดสินใจว่าใครจะจับข้อยกเว้น (และตัดสินว่ามีคนไปจริง) ระบบจะเริ่มคลี่คลายสแต็ก โปรดทราบว่าหากมีข้อยกเว้นเกิดขึ้นจากfinallyบล็อก ...
supercat

18
... รหัสที่คาดว่าจะจับข้อยกเว้นเดิมอาจไม่ได้ทำเช่นนั้น มีหลายกรณีมุมแปลก ๆ
supercat

6
สิ่งนี้จะเกิดขึ้นเมื่อคุณกำหนดค่าตัวดีบั๊กให้ทำลายข้อยกเว้นที่ถูกโยนทิ้งทั้งหมด(ไม่ใช่แค่ข้อยกเว้นที่ไม่สามารถจัดการได้) หรือหากคุณ "ก้าว" ในคำสั่งบางอย่างที่พ่นออกมา คุณจะเห็นข้อความข้อยกเว้นโอกาสแรกของชนิด 'foo' ที่เกิดขึ้นใน YourApp.exe คุณยังสามารถดำเนินการต่อ (F5) หรือก้าวต่อไป (F11) จากนั้นถ้ามีcatchสำหรับสิ่งนี้การควบคุมจะไปที่นั่น ถ้าไม่มีcatchบล็อกคุณจะได้รับ "สองโอกาส" หยุดเวลานี้ข้อความเป็นข้อยกเว้น unhandled ชนิด 'foo' ที่เกิดขึ้นใน YourApp.exe จากตรงนี้การพยายามทำต่อหรือก้าวต่อไปจะไม่ประสบความสำเร็จ
Jeppe Stig Nielsen

@supercat: ฉันจะเรียนรู้เกี่ยวกับรายละเอียดอย่างที่คุณกล่าวไว้ในความคิดเห็นด้านบนได้อย่างไร เป็นผลจากการทดลองด้วยตนเองหรือไม่? อ่านหนังสือ (เล่มไหน)? เป็นข้อมูลเชิงลึกที่น่าประทับใจมาก! ฉันจะขอบคุณถ้าคุณสามารถใช้เวลาสักครู่เพื่อตอบคำถามนี้ ...
anish

2
@NoSaidTheCompiler: ฉันได้อ่านเกี่ยวกับการจัดการข้อยกเว้นในบล็อกต่างๆ ฉันคาดหวังว่าการค้นหา "ตัวกรองข้อยกเว้น. net" ควรทำให้เกิดบล็อกบางส่วนในหัวข้อนี้
supercat

20

มีการแจ้งเตือนข้อยกเว้นครั้งแรกเมื่อเกิดข้อยกเว้น การแจ้งเตือนโอกาสที่สองคือเมื่อไม่ถูกจับ (โอกาส - เช่นเดียวกับโอกาสที่จะเจาะเข้าไปในโค้ดในดีบักเกอร์)

การจัดการข้อยกเว้นโอกาสครั้งแรกและครั้งที่สอง


4

ฉันเพิ่งเริ่มใช้ดีบักเกอร์และพบกับสิ่งนี้ ในการวิจัยของฉันฉันพบโพสต์บล็อก MSDN ข้อยกเว้นโอกาสแรกคืออะไร? ที่เคลียร์ให้ฉัน

ประเด็นสำคัญจากบล็อกโพสต์สำหรับฉันคือมันหมายถึงการแจ้งเตือนไปยังดีบักเกอร์ไม่ใช่สิ่งที่รหัสของฉันจำเป็นต้องจัดการและที่สำคัญที่สุดคือ "ข้อความยกเว้นโอกาสแรกส่วนใหญ่มักไม่ได้หมายความว่ามีปัญหาใน รหัส."


โปรดใส่ข้อความที่ตัดตอนมา ( ไม่ใช่บทความทั้งหมด ) ของสิ่งที่คุณพบว่ามีประโยชน์จากลิงก์นั้น มีลิงค์ก่อนหน้านี้ให้ตอบเฉพาะกับลิงค์เดียวกับที่ถูกลบ
Mark Hall

ประเด็นใหญ่สำหรับฉันคือมันหมายถึงการแจ้งเตือนไปยังดีบักเกอร์ไม่ใช่สิ่งที่รหัสของฉันจำเป็นต้องจัดการและที่สำคัญที่สุดคือ "ข้อความยกเว้นโอกาสแรกส่วนใหญ่มักไม่ได้หมายความว่ามีปัญหาในรหัส"
codingatty

ฉันได้เพิ่มความคิดเห็นของคุณในคำตอบของคุณฉันรู้สึกว่าลิงก์มีความสำคัญมากพอที่จะแก้ไขได้ฉันพยายามทำให้แน่ใจว่าลิงก์นั้นจะไม่ถือว่าเป็นเพียงคำตอบเหมือนครั้งก่อน ๆ ที่ได้รับ
Mark Hall

0

เมื่อแอปพลิเคชันกำลังถูกดีบักดีบักเกอร์จะได้รับการแจ้งเตือนทุกครั้งที่พบข้อยกเว้น ณ จุดนี้แอปพลิเคชันจะถูกระงับและดีบักเกอร์จะตัดสินใจว่าจะจัดการกับข้อยกเว้นอย่างไร การส่งผ่านกลไกนี้ครั้งแรกเรียกว่าข้อยกเว้น "โอกาสแรก"

ขึ้นอยู่กับการกำหนดค่าของดีบักเกอร์แอปพลิเคชันจะดำเนินการต่อแอปพลิเคชันและส่งผ่านข้อยกเว้นหรือจะปล่อยให้แอปพลิเคชันถูกระงับและเข้าสู่โหมดดีบัก หากแอปพลิเคชันจัดการกับข้อยกเว้นแอปพลิเคชันยังคงทำงานตามปกติ

ข้อความยกเว้นโอกาสแรกส่วนใหญ่มักไม่ได้หมายความว่ามีปัญหาในรหัส สำหรับแอปพลิเคชัน / ส่วนประกอบที่จัดการข้อยกเว้นอย่างสง่างามข้อความข้อยกเว้นโอกาสแรกจะแจ้งให้นักพัฒนาทราบว่าพบสถานการณ์พิเศษและได้รับการจัดการแล้ว


0

จากมุมมองของนักพัฒนาก็มากขึ้นเกี่ยวกับข้อยกเว้นที่สองโอกาสเพราะมันจะหมายความว่ามันก็ไม่ได้รับการจัดการในรหัส ; ดังนั้นแอปพลิเคชันจะหยุดลง

โอกาสแรกอาจมีได้หลายคน แต่โอกาสที่น่ากังวลเกี่ยวกับอีกครั้งจากมุมมองของการพัฒนาเป็นโอกาสที่สองเพราะจะทำให้แอปพลิเคชันขัดข้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.