Visual Studio: วิธีการแบ่งข้อยกเว้นการจัดการ?


165

ฉันต้องการให้ Visual Studio หยุดพักเมื่อมีข้อยกเว้นเกิดขึ้น (เช่นฉันไม่ต้องการเห็นข้อความ "โอกาสแรก" ฉันต้องการดีบักข้อยกเว้นจริง)

เช่นฉันต้องการให้ดีบักเกอร์แตกที่ข้อยกเว้น:

try
{
   System.IO.File.Delete(someFilename);
}
catch (Exception)
{
   //we really don't care at runtime if the file couldn't be deleted
}

ฉันเจอหมายเหตุเหล่านี้สำหรับ Visual Studio.NET:

1) ใน VS.NET ไปที่เมนูดีบั๊ก >> "ข้อยกเว้น ... " >> "ข้อยกเว้นรันไทม์ภาษาทั่วไป" >> "ระบบ" และเลือก "System.NullReferenceException"

2) ที่ด้านล่างของกล่องโต้ตอบนั้นจะมีกล่อง "เมื่อข้อยกเว้นถูกโยน:" ให้เลือก "บุกเข้าไปในดีบั๊ก"

3) เรียกใช้สถานการณ์ของคุณ เมื่อมีการโยนข้อยกเว้นดีบักเกอร์จะหยุดและแจ้งให้คุณทราบพร้อมกล่องโต้ตอบที่แจ้งว่า: "ข้อยกเว้นประเภท" System.NullReferenceException "ถูกโยนทิ้ง [ตัวแบ่ง] [ดำเนินการต่อ]"

กดปุ่ม [Break] สิ่งนี้จะทำให้คุณอยู่ในบรรทัดของรหัสที่ทำให้เกิดปัญหา

แต่ไม่สามารถใช้ได้กับ Visual Studio 2005 (ไม่มีตัวเลือกข้อยกเว้นในเมนูดีบั๊ก )

ไม่มีใครรู้ว่ากล่องโต้ตอบค้นหาตัวเลือกนี้ใน Visual Studio นั้นมีกล่องกลุ่ม" เมื่อมีการยกเว้นยกเว้น " พร้อมตัวเลือกในการ " แบ่งเป็นดีบักเกอร์ " หรือไม่

อัปเดต: ปัญหาคือเมนูการดีบักของฉันไม่มีรายการข้อยกเว้น ฉันปรับแต่งเมนูเพื่อเพิ่มด้วยตนเอง


9
ใน VS2015 นั้นอยู่ภายใต้ Debug-> Windows-> การตั้งค่าข้อยกเว้น
PeterVermont

เอาฉันในขณะที่จะหาวิธีการที่จะเรียกคืนเริ่มต้นการตั้งค่ายกเว้นหลังจากที่ผมเปลี่ยนบางส่วนของการตั้งค่ายกเว้นดังนั้นคำตอบใหม่ กู้คืนการตั้งค่าข้อยกเว้นเป็นค่าเริ่มต้น
Mabito

คำตอบ:


170

ขณะที่เปิดโซลูชันให้ไปที่ตัวเลือกเมนูดีบั๊ก - ข้อยกเว้น ( Ctrl+ D, E) จากตรงนั้นคุณสามารถเลือกที่จะทำลายThrownหรือUser-unhandledข้อยกเว้น

แก้ไข: อินสแตนซ์ของฉันถูกตั้งค่าด้วย C # "โปรไฟล์" บางทีมันอาจจะไม่ได้มีโปรไฟล์อื่น ๆ ?


10
ฉันแค่ไม่มีตัวเลือก นั่นจะอธิบายความสับสนของฉัน
Ian Boyd

58
ฉันมีเมนูแก้ไขข้อผิดพลาด แต่ไม่มีตัวเลือกข้อยกเว้น ฉันปรับแต่งเมนูเพื่อเพิ่มด้วยตนเอง; ปุ่มทางลัดทำงานอย่างใดอย่างหนึ่ง (Ctrl + Alt + E)
เอียนบอยด์

3
นอกจากนี้คุณสามารถรีเซ็ตสภาพแวดล้อม VS2010 โดยไปที่ "เครื่องมือ", "นำเข้าการตั้งค่าการส่งออก" และเลือกการรีเซ็ตเป็นสภาพแวดล้อม C # ... มันมีรายการเมนูย่อยข้อยกเว้น
BeardinaSuit

14
ฉันเลือกCommon Language Runtime Exceptions> <All Common Language Runtime Exceptions not in this list>ภายใต้ Visual Studio 2017 และความฝันที่ยิ่งใหญ่ที่สุดของฉันก็เป็นจริง
แอรอนนิวตัน

9
Visual Studio 2015: Debug -> Windows -> การตั้งค่าข้อยกเว้น
achecopar

47

มีหน้าต่าง 'ข้อยกเว้น' ใน VS2005 ... ลอง Ctrl + Alt+ Eเมื่อทำการดีบั๊กแล้วคลิกที่ช่องทำเครื่องหมาย 'โยนทิ้ง' เพื่อดูข้อยกเว้นที่คุณต้องการหยุด


นั่นคือสิ่งที่ฉันต้องการ อยู่ที่ไหนในเมนู? สำหรับชีวิตของฉันฉันไม่สามารถหาได้
Ian Boyd

แป้นพิมพ์ลัดสามารถเปลี่ยนแปลงได้ตามโปรไฟล์ (นักพัฒนา C #, ผู้พัฒนา C ++ ฯลฯ )
Asaf R

1
ฉันมีรายการเมนู: ดีบัก -> ข้อยกเว้น นี่คือกับ VS2005 Professional คุณใช้รุ่น Express หรือไม่
Rob Walker

5
หากคุณต้องการรายการเมนูข้อยกเว้น: เลือกเครื่องมือ | ปรับแต่ง .... คลิกที่แท็บคำสั่ง เลือกหมวดการดีบักในกล่องหมวดหมู่ ค้นหารายการคำสั่ง Exceptions ... จากนั้นลากไปที่เมนู Debug ที่ด้านบนของแอปพลิเคชันแล้ววางในตำแหน่งที่เหมาะสมในเมนู (พบในความคิดเห็นที่: blogs.vertigo.com/personal/keithc/Blog/archive/2007/07/20/… )
sotto

33

เอาฉันสักครู่เพื่อหาสถานที่ใหม่สำหรับการตั้งค่าความคาดหวังดังนั้นคำตอบใหม่

ตั้งแต่ Visual Studio 2015คุณสามารถควบคุมข้อยกเว้นที่จะหยุดในหน้าต่างการตั้งค่าข้อยกเว้น (Debug-> Windows-> การตั้งค่าข้อยกเว้น) ทางลัดที่ยังคง-Ctrl -AltE

วิธีที่ง่ายที่สุดในการจัดการข้อยกเว้นที่กำหนดเองคือการเลือก "ข้อยกเว้นทั้งหมดที่ไม่อยู่ในรายการนี้"

นี่คือภาพหน้าจอจากเวอร์ชั่นภาษาอังกฤษ:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือภาพหน้าจอจากเวอร์ชั่นภาษาเยอรมัน:

ป้อนคำอธิบายรูปภาพที่นี่


16

จาก Visual Studio 2015 และต่อไปคุณต้องไปที่กล่องโต้ตอบ "การตั้งค่าข้อยกเว้น" ( Ctrl+ Alt+ E) และตรวจสอบ "ข้อยกเว้นรันไทม์ภาษาทั่วไป" (หรืออันที่คุณต้องการคือArgumentNullException) เพื่อจัดการกับมันข้อยกเว้นที่

ขั้นตอนที่ 1 ขั้นตอนที่ 1 ขั้นตอนที่ 2 ขั้นตอนที่ 2


8

ตรวจสอบการจัดการข้อยกเว้นด้วยดีบักเกอร์หน้าซึ่งจะอธิบายวิธีตั้งค่านี้

นี่คือขั้นตอน (ในระหว่างการดีบัก):

  1. ในการตรวจแก้จุดบกพร่องเมนูคลิกข้อยกเว้น.

  2. ในกล่องโต้ตอบข้อยกเว้นเลือกโยนสำหรับหมวดหมู่ทั้งหมดของข้อยกเว้นตัวอย่างเช่นข้อยกเว้นรันไทม์ภาษาทั่วไป

    -หรือ-

    ขยายโหนดสำหรับหมวดหมู่ของข้อยกเว้นเช่น Common Language Runtime Exceptions และเลือก Thrown สำหรับข้อยกเว้นเฉพาะภายในหมวดหมู่นั้น


1

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

if(!GlobalTestingBool)
{
   try
   {
      SomeErrorProneMethod();
   }
   catch (...)
   {
      // ... Error handling ...
   }
}
else
{
   SomeErrorProneMethod();
}

ฉันพบว่าสิ่งนี้ทำให้ฉันมีความยืดหยุ่นมากขึ้นในแง่ของการทดสอบเพราะยังมีข้อยกเว้นบางอย่างที่ฉันไม่ต้องการให้ IDE ทำการเจาะ


3
นี่เป็นเทคนิคที่มีประโยชน์ - เปลี่ยนข้อยกเว้นที่จัดการเป็นข้อยกเว้นที่ไม่สามารถจัดการได้ดังนั้นตัวดีบักจะหยุดโดยอัตโนมัติ ฉันไม่แน่ใจว่าทำไมมันถึงถูกลดระดับลงเว้นแต่จะไม่มีวิธีที่ดีในการตั้งค่า GlobalTestingBool ของคุณ ตัวเลือกอื่นที่อาจดีกว่าคือการใช้ Debugger.IsAttached
Joe White

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

ข้อยกเว้นควรถูกโยนในรหัสหากมีเงื่อนไขพิเศษ - สิ่งที่ยอมรับไม่ได้ - และควรถูกจับในระดับที่สามารถตัดสินใจได้ว่าจะจัดการอย่างไร รหัสเช่นนี้ทำให้เส้นทางการดำเนินการมีความซับซ้อน
Lee Oades

ฉันรู้ว่านี่เป็นคำตอบที่เก่ามาก แต่สำหรับ googler สุ่มอย่างฉันคุณสามารถเพิ่มได้catch(){/*handle or not*/ throw; } // throw without any exception specified will rethrow original exception with original callstack etc
Jan 'splite' K.

0

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

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