คำถามติดแท็ก exception-handling

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


5
ยกข้อยกเว้นด้วยประเภทและข้อความที่แตกต่างกันรักษาข้อมูลที่มีอยู่
ฉันกำลังเขียนโมดูลและต้องการมีลำดับชั้นข้อยกเว้นแบบรวมสำหรับข้อยกเว้นที่สามารถยกระดับได้ (เช่นการสืบทอดจากFooErrorคลาสนามธรรมสำหรับfooข้อยกเว้นเฉพาะทั้งหมดของโมดูล) สิ่งนี้ช่วยให้ผู้ใช้โมดูลสามารถตรวจจับข้อยกเว้นเฉพาะเหล่านั้นและจัดการพวกมันอย่างชัดเจนหากจำเป็น แต่มีข้อยกเว้นมากมายที่ยกมาจากโมดูลเนื่องจากข้อยกเว้นอื่น ๆ เช่นความล้มเหลวในบางงานเนื่องจาก OSError บนไฟล์ สิ่งที่ฉันต้องการคือ"ห่อ" ข้อยกเว้นที่จับได้ว่ามันมีประเภทและข้อความที่แตกต่างกันดังนั้นข้อมูลจะมีอยู่ในลำดับชั้นการเผยแพร่ต่อไปโดยสิ่งใดก็ตามที่จับข้อยกเว้น แต่ฉันไม่ต้องการสูญเสียชนิดข้อความและการติดตามสแต็กที่มีอยู่เดิม นั่นคือข้อมูลที่มีประโยชน์ทั้งหมดสำหรับคนที่พยายามแก้ไขปัญหา ตัวจัดการข้อยกเว้นระดับบนสุดไม่ดีนักเนื่องจากฉันพยายามตกแต่งข้อยกเว้นก่อนที่มันจะเพิ่มระดับสแต็คการเผยแพร่ต่อไปและตัวจัดการระดับบนสุดจะสายเกินไป นี่เป็นส่วนหนึ่งที่ได้รับการแก้ไขโดยการรับfooประเภทข้อยกเว้นเฉพาะของโมดูลจากประเภทที่มีอยู่ (เช่นclass FooPermissionError(OSError, FooError)) แต่นั่นไม่ได้ทำให้ง่ายต่อการห่ออินสแตนซ์ข้อยกเว้นที่มีอยู่ในรูปแบบใหม่หรือแก้ไขข้อความ ธPEP 3134 “ข้อยกเว้นผูกมัดและ tracebacks ฝังตัว” กล่าวถึงการเปลี่ยนแปลงที่ยอมรับในหลาม 3.0 สำหรับ“ผูกมัด” วัตถุข้อยกเว้นที่จะแสดงให้เห็นว่าข้อยกเว้นใหม่ถูกยกขึ้นในระหว่างการจัดการของข้อยกเว้นที่มีอยู่ สิ่งที่ฉันพยายามจะทำคือเกี่ยวข้อง: ฉันต้องการมันยังทำงานในรุ่น Python ก่อนหน้านี้และฉันไม่ต้องการสำหรับการผูกมัด แต่สำหรับ polymorphism เท่านั้น วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?


2
เหตุใด UnhandledExceptionEventArgs.ExceptionObject จึงเป็นอ็อบเจ็กต์ไม่ใช่ Exception
ทำไมUnhandledExceptionEventArgs.ExceptionObjectวัตถุถึงไม่ใช่Exception? ฉันติดอยู่กับAppDomain.UnhandledException. ผมอยากจะโยนUnhandledExceptionEventArgs.ExceptionObjectไปยังExceptionและ interogate มัน และด้วยเหตุนี้มันจะเป็นโมฆะหรือไม่? MSDN เอกสารไม่เป็นประโยชน์ exatly รับวัตถุข้อยกเว้นที่ไม่สามารถจัดการได้

5
วิธีบันทึกค่า traceback / sys.exc_info () ในตัวแปร
ฉันต้องการบันทึกชื่อของข้อผิดพลาดและรายละเอียดการย้อนกลับลงในตัวแปร นี่คือความพยายามของฉัน import sys try: try: print x except Exception, ex: raise NameError except Exception, er: print "0", sys.exc_info()[0] print "1", sys.exc_info()[1] print "2", sys.exc_info()[2] เอาท์พุท: 0 <type 'exceptions.NameError'> 1 2 <traceback object at 0xbd5fc8> ผลลัพธ์ที่ต้องการ: 0 NameError 1 2 Traceback (most recent call last): File "exception.py", line 6, in …

6
'ในที่สุด' จะดำเนินการใน Python เสมอหรือไม่?
สำหรับการบล็อกการลองสุดท้ายที่เป็นไปได้ใน Python จะรับประกันfinallyได้หรือไม่ว่าบล็อกจะถูกเรียกใช้งานเสมอ ตัวอย่างเช่นสมมติว่าฉันกลับมาขณะอยู่ในexceptบล็อก: try: 1/0 except ZeroDivisionError: return finally: print("Does this code run?") หรือบางทีฉันอาจจะเพิ่มException: try: 1/0 except ZeroDivisionError: raise finally: print("What about this code?") การทดสอบแสดงให้เห็นว่ามีfinallyการดำเนินการสำหรับตัวอย่างข้างต้น แต่ฉันคิดว่ามีสถานการณ์อื่น ๆ ที่ฉันไม่ได้นึกถึง มีสถานการณ์ใดบ้างที่finallyบล็อกไม่สามารถดำเนินการใน Python ได้

10
การจัดการข้อยกเว้น Spring Resttemplate
ด้านล่างนี้คือข้อมูลโค้ด โดยพื้นฐานแล้วฉันพยายามเผยแพร่ข้อยกเว้นเมื่อรหัสข้อผิดพลาดเป็นอย่างอื่นที่ไม่ใช่ 200 ResponseEntity<Object> response = restTemplate.exchange(url.toString().replace("{version}", version), HttpMethod.POST, entity, Object.class); if(response.getStatusCode().value()!= 200){ logger.debug("Encountered Error while Calling API"); throw new ApplicationException(); } อย่างไรก็ตามในกรณีของการตอบสนอง 500 จากเซิร์ฟเวอร์ฉันได้รับข้อยกเว้น org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:94) ~[spring-web-4.2.3.RELEASE.jar:4.2.3.RELEASE] ฉันจำเป็นต้องสรุปวิธีการแลกเปลี่ยนเทมเพลตที่เหลือจริงๆหรือไม่? แล้วจุดประสงค์ของรหัสคืออะไร?

8
จะโยนข้อยกเว้น std :: ด้วยข้อความตัวแปรได้อย่างไร
นี่คือตัวอย่างของสิ่งที่ฉันมักจะทำเมื่อต้องการเพิ่มข้อมูลบางอย่างในข้อยกเว้น: std::stringstream errMsg; errMsg << "Could not load config file '" << configfile << "'"; throw std::exception(errMsg.str().c_str()); มีวิธีที่ดีกว่าในการทำหรือไม่?

5
จะรับชื่อข้อยกเว้นที่ติดใน Python ได้อย่างไร?
ฉันจะได้รับชื่อของข้อยกเว้นที่เพิ่มขึ้นใน Python ได้อย่างไร เช่น, try: foo = bar except Exception as exception: name_of_exception = ??? assert name_of_exception == 'NameError' print "Failed with exception [%s]" % name_of_exception ตัวอย่างเช่นฉันพบข้อยกเว้นหลายรายการ (หรือทั้งหมด) และต้องการพิมพ์ชื่อของข้อยกเว้นในข้อความแสดงข้อผิดพลาด

16
แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการข้อยกเว้นในแอปพลิเคชัน Windows Forms?
ฉันกำลังอยู่ในขั้นตอนการเขียนแอปพลิเคชัน Windows Forms ตัวแรก ตอนนี้ฉันอ่านหนังสือ C # สองสามเล่มแล้วดังนั้นฉันจึงมีความเข้าใจค่อนข้างดีว่าคุณลักษณะของภาษา C # มีข้อยกเว้นอะไรบ้าง พวกเขาทั้งหมดค่อนข้างเป็นทฤษฎีอย่างไรก็ตามสิ่งที่ฉันยังไม่ได้รับคือความรู้สึกในการแปลแนวคิดพื้นฐานเป็นรูปแบบการจัดการข้อยกเว้นที่ดีในแอปพลิเคชันของฉัน มีใครอยากแบ่งปันมุกแห่งปัญญาในเรื่องนี้ไหม? โพสต์ข้อผิดพลาดทั่วไปที่คุณเคยเห็นมือใหม่อย่างตัวเองทำและคำแนะนำทั่วไปเกี่ยวกับการจัดการข้อยกเว้นเพื่อให้แอปพลิเคชันของฉันมีเสถียรภาพและมีประสิทธิภาพมากขึ้น สิ่งสำคัญที่ฉันกำลังพยายามหาคือ: ฉันควรโยนข้อยกเว้นอีกครั้งเมื่อใด ฉันควรลองมีกลไกจัดการข้อผิดพลาดส่วนกลางบ้างไหม การจัดการข้อยกเว้นที่อาจถูกโยนทิ้งมีผลการดำเนินงานเมื่อเทียบกับการทดสอบล่วงหน้าอย่างไร้ค่าเช่นมีไฟล์ในดิสก์หรือไม่ โค้ดที่เรียกใช้งานได้ทั้งหมดควรอยู่ในบล็อก try-catch-last หรือไม่? มีบางครั้งหรือไม่ที่อาจยอมรับบล็อกการจับที่ว่างได้? รับคำแนะนำทั้งหมดอย่างสุดซึ้ง!

12
PHP: ข้อยกเว้นและข้อผิดพลาด?
บางทีฉันอาจจะพลาดที่ไหนสักแห่งในคู่มือ PHP แต่อะไรคือความแตกต่างระหว่างข้อผิดพลาดและข้อยกเว้น? ความแตกต่างเดียวที่ฉันเห็นคือข้อผิดพลาดและข้อยกเว้นจะได้รับการจัดการที่แตกต่างกัน แต่อะไรทำให้เกิดข้อยกเว้นและอะไรทำให้เกิดข้อผิดพลาด?

2
จะพยายาม / ในที่สุด (โดยไม่มีการจับ) ฟองข้อยกเว้นหรือไม่?
ฉันเกือบจะคิดบวกว่าคำตอบคือใช่ หากฉันใช้การบล็อกลองในที่สุด แต่ไม่ได้ใช้บล็อก Catch ข้อยกเว้นใด ๆ จะเกิดฟอง แก้ไข? มีความคิดเกี่ยวกับการปฏิบัติโดยทั่วไปหรือไม่? เซท


7
ต้องจัดการข้อยกเว้นที่ไม่ถูกจับและส่งไฟล์บันทึก
อัปเดต: โปรดดูโซลูชัน "ยอมรับ" ด้านล่าง เมื่อแอปของฉันสร้างข้อยกเว้นที่ไม่สามารถจัดการได้แทนที่จะยุติเพียงแค่ฉันต้องการเปิดโอกาสให้ผู้ใช้ส่งไฟล์บันทึกก่อน ฉันตระหนักดีว่าการทำงานมากขึ้นหลังจากได้รับข้อยกเว้นแบบสุ่มนั้นมีความเสี่ยง แต่เดี๋ยวก่อนสิ่งที่แย่ที่สุดคือแอปขัดข้องและไฟล์บันทึกไม่ได้รับการส่ง นี่กลายเป็นเรื่องยากกว่าที่ฉันคาดไว้ :) สิ่งที่ได้ผล: (1) การดักจับข้อยกเว้นที่ไม่ถูกจับ (2) การแยกข้อมูลบันทึกและการเขียนลงในไฟล์ สิ่งที่ยังใช้ไม่ได้: (3) เริ่มต้นกิจกรรมเพื่อส่งอีเมล ท้ายที่สุดฉันจะมีกิจกรรมอื่นเพื่อขออนุญาตของผู้ใช้ หากฉันได้รับกิจกรรมอีเมลที่ใช้งานได้ฉันไม่คาดหวังว่าอีกฝ่ายจะมีปัญหามากนัก ปมของปัญหาคือข้อยกเว้นที่ไม่สามารถจัดการได้ถูกจับในคลาสแอปพลิเคชันของฉัน เนื่องจากนั่นไม่ใช่กิจกรรมจึงไม่ชัดเจนว่าจะเริ่มกิจกรรมด้วย Intent ได้อย่างไร ACTION_SEND นั่นคือโดยปกติในการเริ่มกิจกรรมหนึ่งจะเรียก startActivity และดำเนินการต่อด้วย onActivityResult วิธีการเหล่านี้รองรับโดย Activity แต่ไม่รองรับ Application ข้อเสนอแนะเกี่ยวกับวิธีการทำสิ่งนี้หรือไม่? นี่คือสนิปโค้ดบางส่วนเพื่อเป็นแนวทางเริ่มต้น: public class MyApplication extends Application { defaultUncaughtHandler = Thread.getDefaultUncaughtExceptionHandler(); public void onCreate () { Thread.setDefaultUncaughtExceptionHandler (new …

12
Visual Studio 2015 แบ่งข้อยกเว้นที่ไม่สามารถจัดการได้ไม่ทำงาน
Visual Studio เคยมีช่องทำเครื่องหมายเฉพาะสำหรับ "Break on Un-handled except" ในปี 2558 สิ่งนี้ถูกลบ (หรือย้ายไปที่ไหนสักแห่งที่ฉันหาไม่เจอ) ดังนั้นตอนนี้โครงการที่แปลงแล้วของฉันจะไม่พังอีกต่อไปหากฉันไม่สามารถจัดหาตัวจัดการข้อยกเว้นระดับผู้ใช้ ฉันไม่ต้องการทำลาย "ข้อยกเว้น" ทั้งหมดเพราะฉันจัดการเฉพาะ ในกรณีที่ฉันไม่สามารถจัดหาเครื่องจัดการเฉพาะได้ ตอนนี้รหัสของฉันเพิ่งออกจากขั้นตอนปัจจุบันและดำเนินการต่อในตำแหน่งสแต็กการโทรถัดไปไม่ดี ใครรู้วิธีเอาคืนใน Visual Studio 2015 บ้าง? ฉันเพิ่งอัปเกรดเป็นฉบับชุมชนเมื่อวานนี้

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