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

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

5
เกิดอะไรขึ้นในการลอง {return x; } ในที่สุด {x = null; } คำให้การ?
ฉันเห็นเคล็ดลับนี้ในอีกคำถามหนึ่งและสงสัยว่ามีใครบางคนอธิบายให้ฉันฟังว่ามันใช้งานได้อย่างไรบนโลกใบนี้? try { return x; } finally { x = null; } ผมหมายถึงการที่ไม่finallyเป็นไปตามข้อจริงๆรันหลังจากreturnคำสั่ง? รหัสนี้เป็นวิธีที่ไม่ปลอดภัยหรือไม่ คุณนึกถึงการtry-finallyแฮ็กเพิ่มเติมที่สามารถทำแฮ็คนี้ได้หรือไม่?

10
วิธีใช้ ELMAH เพื่อบันทึกข้อผิดพลาดด้วยตนเอง
เป็นไปได้ไหมที่จะทำสิ่งต่อไปนี้โดยใช้ ELMAH logger.Log(" something"); ฉันกำลังทำสิ่งนี้: try { // Code that might throw an exception } catch(Exception ex) { // I need to log error here... } ข้อยกเว้นนี้จะไม่ถูกบันทึกโดยอัตโนมัติโดย ELMAH เนื่องจากมีการจัดการ

5
วิธีการโยนข้อยกเว้น C ++
ฉันมีความเข้าใจที่แย่มากเกี่ยวกับการจัดการข้อยกเว้น (เช่นวิธีการปรับแต่งการโยนลองจับคำแถลงเพื่อจุดประสงค์ของฉันเอง) ตัวอย่างเช่นฉันได้กำหนดฟังก์ชันดังนี้: int compare(int a, int b){...} ฉันต้องการให้ฟังก์ชันส่งข้อยกเว้นพร้อมข้อความบางข้อความเมื่อ a หรือ b เป็นลบ ฉันจะเข้าหาสิ่งนี้ในนิยามของฟังก์ชันได้อย่างไร?

11
การตรวจจับข้อยกเว้นหลายประเภทในหนึ่ง catch catch บล็อก
ฉันต้องการวิธีที่สะอาดกว่าในการรับฟังก์ชั่นต่อไปนี้เพื่อจับAErrorและBErrorในหนึ่งช่วงตึก: try { /* something */ } catch( AError, BError $e ) { handler1( $e ) } catch( Exception $e ) { handler2( $e ) } มีวิธีการทำเช่นนี้? หรือฉันต้องจับแยกต่างหาก AErrorและBerrorมีคลาสฐานที่แชร์ แต่พวกเขายังแชร์กับประเภทอื่น ๆ ที่ฉันอยากผ่านhandler2ดังนั้นฉันจึงไม่สามารถเรียนคลาสฐานได้

6
ตรวจพบข้อยกเว้นทั่วโลกในแอปพลิเคชัน WPF หรือไม่
เรามีแอปพลิเคชั่น WPF ซึ่งบางส่วนของมันอาจเกิดข้อยกเว้นในขณะทำงาน ฉันต้องการจับข้อยกเว้นที่ไม่สามารถจัดการได้ทั่วโลกและบันทึกพวกเขา แต่อย่างอื่นดำเนินการโปรแกรมต่อไปราวกับว่าไม่มีอะไรเกิดขึ้น (kinda เช่น VB's On Error Resume Next) เป็นไปได้ใน C #? และถ้าเป็นเช่นนั้นฉันจะต้องวางรหัสการจัดการข้อยกเว้นไว้ที่ไหน ขณะนี้ฉันไม่เห็นจุดใดจุดหนึ่งที่ฉันสามารถล้อมรอบtry/ catchและซึ่งจะจับข้อยกเว้นทั้งหมดที่อาจเกิดขึ้น และถึงอย่างนั้นฉันก็จะเหลืออะไรก็ตามที่ถูกประหารเพราะจับได้ หรือฉันกำลังคิดผิดทางอย่างน่ากลัวที่นี่? การทางพิเศษแห่งประเทศไทย:เพราะหลายคนด้านล่างชี้ให้เห็น: แอพลิเคชันไม่ได้สำหรับการควบคุมโรงไฟฟ้านิวเคลียร์ ถ้ามันล้มเหลวมันไม่ได้เป็นเรื่องใหญ่อะไร แต่มีข้อยกเว้นแบบสุ่มที่เกี่ยวข้องกับ UI เป็นส่วนใหญ่เป็นสิ่งที่สร้างความรำคาญในบริบทที่มันจะถูกใช้ มี (และอาจจะยังคงเป็น) บางส่วนและเนื่องจากใช้สถาปัตยกรรมปลั๊กอินและอาจขยายโดยผู้อื่น (เช่นนักเรียนในกรณีนั้นดังนั้นจึงไม่มีนักพัฒนาที่มีประสบการณ์ที่สามารถเขียนโค้ดปราศจากข้อผิดพลาดได้อย่างสมบูรณ์) สำหรับข้อยกเว้นที่ตรวจพบ: ฉันบันทึกไว้ในไฟล์บันทึกรวมถึงการติดตามสแต็กทั้งหมด นั่นคือจุดรวมของการออกกำลังกายนั้น เพียงเพื่อตอบโต้คนเหล่านั้นที่กำลังเปรียบเทียบกับ OERN ของ VB อย่างแท้จริง ฉันรู้ว่าการละเว้นข้อผิดพลาดบางประเภทเป็นอันตรายและอาจทำให้แอปพลิเคชันของฉันเสียหาย อย่างที่เคยกล่าวไว้ก่อนหน้านี้โปรแกรมนี้ไม่ได้มีความสำคัญสำหรับทุกคน ไม่มีใครในใจที่ถูกต้องของพวกเขาจะพนันความอยู่รอดของอารยธรรมมนุษย์ในนั้น มันเป็นเพียงเครื่องมือเล็ก ๆ สำหรับการทดสอบแนวทางการออกแบบบางอย่าง วิศวกรรมซอฟต์แวร์. สำหรับการใช้งานแอปพลิเคชั่นในทันทีมีหลายสิ่งที่อาจเกิดขึ้นได้ยกเว้น: ไม่มีการจัดการข้อยกเว้น - กล่องโต้ตอบข้อผิดพลาดและการออกจากแอปพลิเคชัน ต้องทำการทดสอบซ้ำแม้ว่าจะมีอีกเรื่องหนึ่ง …

15
จะทดสอบได้อย่างไรว่าไม่มีข้อยกเว้นเกิดขึ้น?
ฉันรู้ว่าวิธีหนึ่งที่จะทำได้: @Test public void foo(){ try{ //execute code that you expect not to throw Exceptions. } catch(Exception e){ fail("Should not have thrown any exception"); } } มีวิธีใดที่สะอาดกว่าในการทำสิ่งนี้ (อาจใช้ Junit @Ruleหรือไม่?)

12
โค้ดในคำสั่งในที่สุดจะเริ่มทำงานหรือไม่หากฉันส่งคืนค่าในบล็อกลองใช้
ฉันกำลังตรวจสอบโค้ดสำหรับเพื่อนและบอกว่าเขากำลังใช้คำสั่งส่งคืนภายในบล็อกการทดลองใช้ในที่สุด รหัสในส่วนสุดท้ายยังคงทำงานอยู่แม้ว่าบล็อกทดลองที่เหลือจะไม่ใช้งานหรือไม่ ตัวอย่าง: public bool someMethod() { try { return true; throw new Exception("test"); // doesn't seem to get executed } finally { //code in question } }


15
ตรวจสอบข้อยกเว้นของเธรดในตัวเรียกเธรดใน Python
ฉันใหม่กับ Python และการเขียนโปรแกรมแบบมัลติเธรดโดยทั่วไป โดยทั่วไปฉันมีสคริปต์ที่จะคัดลอกไฟล์ไปยังตำแหน่งอื่น ฉันต้องการให้วางในเธรดอื่นเพื่อให้สามารถแสดงผล....เพื่อระบุว่าสคริปต์ยังคงทำงานอยู่ ปัญหาที่ฉันมีอยู่คือหากไฟล์ไม่สามารถคัดลอกได้มันจะทำให้เกิดข้อยกเว้น ไม่เป็นไรหากทำงานในเธรดหลัก อย่างไรก็ตามการมีรหัสต่อไปนี้ใช้ไม่ได้: try: threadClass = TheThread(param1, param2, etc.) threadClass.start() ##### **Exception takes place here** except: print "Caught an exception" ในคลาสเธรดตัวเองฉันพยายามโยนข้อยกเว้นอีกครั้ง แต่ไม่ทำงาน ฉันเคยเห็นผู้คนที่นี่ถามคำถามที่คล้ายกัน แต่พวกเขาทั้งหมดดูเหมือนจะทำสิ่งที่เฉพาะเจาะจงมากกว่าสิ่งที่ฉันพยายามทำ (และฉันไม่ค่อยเข้าใจวิธีแก้ไขที่เสนอ) ฉันเคยเห็นคนพูดถึงการใช้งานของsys.exc_info()แต่ฉันไม่ทราบว่าจะใช้หรือไม่ ความช่วยเหลือทั้งหมดได้รับการชื่นชมอย่างมาก! แก้ไข:รหัสสำหรับชั้นด้ายอยู่ด้านล่าง: class TheThread(threading.Thread): def __init__(self, sourceFolder, destFolder): threading.Thread.__init__(self) self.sourceFolder = sourceFolder self.destFolder = destFolder def run(self): try: shul.copytree(self.sourceFolder, …

7
Exception.Message vs Exception.ToString ()
Exception.Messageฉันมีรหัสที่มีการเข้าสู่ระบบ Exception.ToString()แต่ผมอ่านบทความที่ระบุว่ามันจะดีกว่ากับการใช้ ด้วยข้อมูลหลังนี้คุณจะเก็บข้อมูลสำคัญเกี่ยวกับข้อผิดพลาดได้มากขึ้น สิ่งนี้เป็นจริงและปลอดภัยหรือไม่ที่จะไปข้างหน้าและแทนที่การบันทึกรหัสทั้งหมดException.Message? ฉันใช้เลย์เอาต์ XML สำหรับlog4netด้วย เป็นไปได้หรือไม่ที่Exception.ToString()อาจมีอักขระ XML ไม่ถูกต้องซึ่งอาจทำให้เกิดปัญหา

15
C ++ แสดงการติดตามสแต็กบนข้อยกเว้น
ฉันต้องการมีวิธีรายงานการติดตามสแต็กกับผู้ใช้หากมีข้อผิดพลาดเกิดขึ้น วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร? ใช้รหัสพิเศษจำนวนมากหรือไม่ ในการตอบคำถาม: ฉันต้องการให้พกพาได้ถ้าเป็นไปได้ ฉันต้องการข้อมูลที่จะปรากฏขึ้นเพื่อให้ผู้ใช้สามารถคัดลอกกองติดตามและส่งอีเมลถึงฉันหากมีข้อผิดพลาดเกิดขึ้น

25
คุณใช้การจับซ้ำได้อย่างไร
ลองจับมีไว้เพื่อช่วยในการจัดการข้อยกเว้น หมายความว่าจะช่วยให้ระบบของเรามีความแข็งแกร่งยิ่งขึ้น: พยายามกู้คืนจากเหตุการณ์ที่ไม่คาดคิด เราสงสัยว่ามีบางอย่างอาจเกิดขึ้นเมื่อดำเนินการและคำสั่ง (ส่งข้อความ) ดังนั้นจึงถูกปิดล้อมในการลอง หากสิ่งนั้นเกือบเกิดขึ้นโดยไม่คาดคิดเราสามารถทำบางสิ่งได้: เราเขียนสิ่งที่จับได้ ฉันไม่คิดว่าเราถูกเรียกให้เข้าสู่ระบบยกเว้น สิ่งที่ฉันบล็อก catch มีขึ้นเพื่อให้โอกาสเราในการกู้คืนจากข้อผิดพลาด ตอนนี้สมมติว่าเรากู้คืนจากข้อผิดพลาดเพราะเราสามารถแก้ไขสิ่งที่ผิด อาจเป็นเรื่องดีสุด ๆ ที่จะลองทำใหม่: try{ some_instruction(); } catch (NearlyUnexpectedException e){ fix_the_problem(); retry; } สิ่งนี้จะตกอยู่ในวงนิรันดร์อย่างรวดเร็ว แต่สมมุติว่า fix_the_problem คืนค่าเป็นจริงจากนั้นเราลองอีกครั้ง เนื่องจากไม่มีสิ่งเช่นนี้ใน Java คุณจะแก้ไขปัญหานี้อย่างไร สิ่งที่จะเป็นรหัสการออกแบบที่ดีที่สุดของคุณสำหรับการแก้ปัญหานี้? นี่เป็นคำถามเชิงปรัชญาเนื่องจากฉันรู้แล้วว่าสิ่งที่ฉันขอไม่ได้รับการสนับสนุนโดยตรงจาก Java

15
วิธีใช้ลอง catch สำหรับการจัดการข้อยกเว้นเป็นวิธีปฏิบัติที่ดีที่สุด
ในขณะที่รักษารหัสของเพื่อนร่วมงานจากแม้กระทั่งคนที่อ้างว่าเป็นนักพัฒนาอาวุโสฉันมักจะเห็นรหัสต่อไปนี้: try { //do something } catch { //Do nothing } หรือบางครั้งพวกเขาเขียนข้อมูลการบันทึกลงในไฟล์บันทึกเช่นtry catchบล็อกต่อไปนี้ try { //do some work } catch(Exception exception) { WriteException2LogFile(exception); } ฉันแค่สงสัยว่าสิ่งที่พวกเขาทำเป็นแนวปฏิบัติที่ดีที่สุดหรือไม่? มันทำให้ฉันสับสนเพราะในความคิดของฉันผู้ใช้ควรรู้ว่าเกิดอะไรขึ้นกับระบบ โปรดให้คำแนะนำกับฉัน

25
เคยมีข้อได้เปรียบในการใช้ 'goto' ในภาษาที่สนับสนุนลูปและฟังก์ชั่นหรือไม่? ถ้าเป็นเช่นนั้นทำไม
ฉันอยู่ภายใต้การแสดงผลที่gotoไม่ควรใช้ถ้าเป็นไปได้ ในขณะที่อ่าน libavcodec (ซึ่งเขียนเป็นภาษา C) เมื่อวันก่อนฉันสังเกตเห็นการใช้งานหลายอย่าง มันเคยเป็นประโยชน์ที่จะใช้gotoในภาษาที่รองรับลูปและฟังก์ชั่นหรือไม่? ถ้าเป็นเช่นนั้นทำไม

20
ทำไมจึงลอง {... } ในที่สุด {…} ดี ลอง {…} จับ {} ไม่ดีใช่ไหม
ฉันเคยเห็นคนพูดว่ามันเป็นรูปแบบที่ไม่ดีที่จะใช้ catch โดยไม่มีข้อโต้แย้งโดยเฉพาะถ้า catch นั้นไม่ได้ทำอะไร: StreamReader reader=new StreamReader("myfile.txt"); try { int i = 5 / 0; } catch // No args, so it will catch any exception {} reader.Close(); อย่างไรก็ตามนี่ถือว่าเป็นรูปแบบที่ดี: StreamReader reader=new StreamReader("myfile.txt"); try { int i = 5 / 0; } finally // Will execute despite any exception { …

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