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

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

5
ตัวจัดการข้อยกเว้น. NET Global ในแอปพลิเคชันคอนโซล
คำถาม: ฉันต้องการกำหนดตัวจัดการข้อยกเว้นส่วนกลางสำหรับข้อยกเว้นที่ไม่สามารถจัดการได้ในแอปพลิเคชันคอนโซลของฉัน ใน asp.net หนึ่งสามารถกำหนดหนึ่งใน global.asax และใน windows applications / บริการหนึ่งสามารถกำหนดดังนี้ AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler); แต่ฉันจะกำหนดตัวจัดการข้อยกเว้นส่วนกลางสำหรับแอปพลิเคชันคอนโซลได้อย่างไร currentDomain ดูเหมือนว่าจะไม่ทำงาน (. NET 2.0)? แก้ไข: ผิดพลาดโง่ ๆ ใน VB.NET เราต้องเพิ่มคีย์เวิร์ด "AddHandler" ต่อหน้าโดเมนปัจจุบันหรือมิฉะนั้นจะไม่เห็นเหตุการณ์ UnhandledException ใน IntelliSense ... นั่นเป็นเพราะคอมไพเลอร์ VB.NET และ C # ปฏิบัติต่อการจัดการเหตุการณ์ต่างกัน


1
Python“ เพิ่มจาก” การใช้งาน
ความแตกต่างระหว่างraiseและraise fromในงูใหญ่คืออะไร? try: raise ValueError except Exception as e: raise IndexError ซึ่งให้ผลผลิต Traceback (most recent call last): File "tmp.py", line 2, in <module> raise ValueError ValueError During handling of the above exception, another exception occurred: Traceback (most recent call last): File "tmp.py", line 4, in <module> raise IndexError IndexError และ …

20
เหตุใดการจับที่ว่างเปล่าจึงปิดกั้นความคิดที่ไม่ดี [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ ฉันเพิ่งเห็นคำถามเกี่ยวกับลองจับซึ่งคน (รวมถึง Jon Skeet) ว่าบล็อกว่างเปล่าจับเป็นความคิดที่ไม่ดีจริง ๆ ทำไมเป็นเช่นนี้ ไม่มีสถานการณ์ที่จับเปล่าไม่มีการตัดสินใจออกแบบที่ผิดหรือเปล่า? ตัวอย่างเช่นฉันหมายถึงบางครั้งคุณต้องการรับข้อมูลเพิ่มเติมจากที่อื่น (เว็บเซอร์, ฐานข้อมูล) และคุณไม่สนใจว่าคุณจะได้รับข้อมูลนี้หรือไม่ ดังนั้นคุณพยายามที่จะรับมันและหากมีอะไรเกิดขึ้นก็ไม่เป็นไรฉันจะเพิ่ม "catch (ข้อยกเว้นละเว้น) {}" และนั่นคือทั้งหมด


22
System.Security.SecurityException เมื่อเขียนไปยังบันทึกเหตุการณ์
ฉันกำลังพยายามพอร์ตแอพ ASP.NET จาก Server 2003 (และ IIS6) ไปยัง Server 2008 (IIS7) เมื่อฉันลองและเยี่ยมชมหน้าเว็บในเบราว์เซอร์ฉันได้รับสิ่งนี้: ผิดพลาดเซิร์ฟเวอร์ใน '/' แอพลิเคชัน. ข้อยกเว้นด้านความปลอดภัย คำอธิบาย: แอปพลิเคชันพยายามดำเนินการตามนโยบายความปลอดภัยที่ไม่ได้รับอนุญาต หากต้องการให้แอปพลิเคชันนี้ได้รับอนุญาตที่จำเป็นโปรดติดต่อผู้ดูแลระบบของคุณหรือเปลี่ยนระดับความน่าเชื่อถือของแอปพลิเคชันในไฟล์กำหนดค่า รายละเอียดข้อยกเว้น: System.Security.SecurityException: ไม่พบแหล่งที่มา แต่ไม่สามารถค้นหาบันทึกเหตุการณ์บางส่วนหรือทั้งหมด บันทึกที่เข้าถึงไม่ได้: ความปลอดภัย ข้อผิดพลาดของแหล่งที่มา: ข้อยกเว้นที่ไม่สามารถจัดการได้ถูกสร้างขึ้นระหว่างการดำเนินการตามคำขอเว็บปัจจุบัน ข้อมูลเกี่ยวกับที่มาและตำแหน่งของข้อยกเว้นสามารถระบุได้โดยใช้การติดตามสแต็กข้อยกเว้นด้านล่าง กองติดตาม: [SecurityException: ไม่พบแหล่งที่มา แต่ไม่สามารถค้นหาบันทึกเหตุการณ์บางส่วนหรือทั้งหมด บันทึกที่เข้าถึงไม่ได้: ความปลอดภัย] System.Diagnostics.EventLog.FindSourceRegistration (แหล่งที่มาของสตริงเครื่องชื่อ String, บูลีน readOnly เท่านั้น) +562 System.Diagnostics.EventLog.FindSourceRegistration (แหล่งที่มาของสตริงเครื่องชื่อ String) +251 [snip] นี่คือสิ่งที่ฉันได้ทำเพื่อพยายามแก้ไข: ให้“ทุกคน” HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\Securityได้รับอนุญาตการเข้าถึงแบบเต็มไปยังคีย์ สิ่งนี้ใช้ได้ผล …

13
ทำไมใช้ใน C # ในที่สุด?
สิ่งใดก็ตามที่อยู่ในบล็อกในที่สุดก็จะถูกดำเนินการ (เกือบ) เสมอดังนั้นอะไรคือความแตกต่างระหว่างการวางโค้ดลงในโค้ดหรือปล่อยให้มันไม่ถูกเปิดเผย?

10
การบันทึกข้อยกเว้นที่ไม่ได้ตรวจสอบใน Python
คุณจะทำให้เกิดข้อยกเว้นที่ไม่ได้ตรวจสอบเพื่อเอาท์พุทผ่านloggingโมดูลแทนที่จะทำstderrอย่างไร ฉันรู้วิธีที่ดีที่สุดในการทำเช่นนี้คือ: try: raise Exception, 'Throwing a boring exception' except Exception, e: logging.exception(e) แต่สถานการณ์ของฉันเป็นเช่นนั้นมันจะดีจริงๆถ้าlogging.exception(...)ถูกเรียกโดยอัตโนมัติเมื่อใดก็ตามที่ข้อยกเว้นไม่ได้ถูกจับ

9
โยน HttpResponseException หรือส่งคืน Request สร้าง CreateErrorResponse ไหม?
หลังจากตรวจสอบข้อยกเว้นการจัดการบทความใน ASP.NET Web APIฉันสับสนนิดหน่อยว่าเมื่อใดที่จะโยนข้อยกเว้น vs ส่งคืนการตอบกลับข้อผิดพลาด ฉันยังสงสัยว่ามันเป็นไปได้ที่จะปรับเปลี่ยนการตอบสนองเมื่อวิธีการของคุณส่งคืนรูปแบบเฉพาะโดเมนแทนHttpResponseMessage... ดังนั้นการสรุปที่นี่คำถามของฉันตามด้วยรหัสบางกรณี #s: คำถาม คำถามเกี่ยวกับ Case # 1 ฉันควรใช้HttpResponseMessageแทนโมเดลโดเมนที่เป็นรูปธรรมเสมอเพื่อให้สามารถปรับแต่งข้อความได้หรือไม่ สามารถปรับแต่งข้อความได้หรือไม่หากคุณส่งคืนโมเดลโดเมนที่เป็นรูปธรรม? คำถามเกี่ยวกับ Case # 2,3,4 ฉันควรจะโยนข้อยกเว้นหรือตอบกลับข้อผิดพลาด? หากคำตอบคือ "มันขึ้นอยู่กับ" คุณสามารถให้สถานการณ์ / ตัวอย่างเมื่อใดที่จะใช้หนึ่งเทียบกับอีก ความแตกต่างระหว่างการขว้างปาคืออะไรHttpResponseExceptionVS Request.CreateErrorResponse? ผลลัพธ์ไปยังลูกค้าดูเหมือนกัน ... ฉันควรจะใช้HttpErrorเพื่อ "ห่อ" ข้อความตอบสนองในข้อผิดพลาด (ไม่ว่าจะเป็นข้อยกเว้นโยนหรือการตอบกลับข้อผิดพลาด)? ตัวอย่างกรณี // CASE #1 public Customer Get(string id) { var customer = _customerService.GetById(id); if (customer == …

3
ApplicationException คืออะไรใน. NET
จะโยนข้อยกเว้นผมมักจะใช้ในตัวชั้นเรียนข้อยกเว้นเช่นและArgumentNullException NotSupportedExceptionอย่างไรก็ตามบางครั้งฉันจำเป็นต้องใช้ข้อยกเว้นที่กำหนดเองและในกรณีที่ฉันเขียน: class SlippedOnABananaException : Exception { } class ChokedOnAnAppleException : Exception { } และอื่น ๆ จากนั้นฉันก็โยนและจับสิ่งเหล่านี้ในรหัสของฉัน แต่วันนี้ฉันเข้าApplicationExceptionเรียน - ฉันควรจะใช้สิ่งนั้นแทนหรือไม่? เพื่ออะไร ดูเหมือนไม่มีประสิทธิภาพที่จะมีคลาส Exception ที่เหมือนกันอย่างมีประสิทธิภาพจำนวนมากที่มีชื่อต่างกัน (โดยปกติฉันไม่ต้องการฟังก์ชันใด ๆ เลย) แต่ฉันไม่ชอบความคิดที่จะจับรหัสทั่วไปApplicationExceptionและต้องใช้รหัสพิเศษเพื่อพิจารณาว่าข้อผิดพลาดคืออะไร ApplicationExceptionรหัสของฉันควรตรงกับที่ใด?

10
การจัดการข้อยกเว้นบริการ Spring Boot REST
ฉันกำลังพยายามตั้งค่าเซิร์ฟเวอร์บริการ REST ขนาดใหญ่ เรากำลังใช้ Spring Boot 1.2.1 Spring 4.1.5 และ Java 8 ตัวควบคุมของเรากำลังใช้งาน @RestController และคำอธิบายประกอบ @RequestMapping มาตรฐาน ปัญหาของฉันที่ฤดูใบไม้ผลิ Boot /errorตั้งค่าการเปลี่ยนเส้นทางเริ่มต้นสำหรับข้อยกเว้นในการควบคุม จากเอกสาร: Spring Boot จัดให้มีการแมป / ข้อผิดพลาดตามค่าเริ่มต้นที่จัดการข้อผิดพลาดทั้งหมดอย่างสมเหตุสมผลและมีการลงทะเบียนเป็นหน้าข้อผิดพลาด 'สากล' ในคอนเทนเนอร์ servlet มาจากหลายปีที่เขียนแอปพลิเคชัน REST ด้วย Node.js นี่คือสิ่งที่สมเหตุสมผล ข้อยกเว้นใด ๆ ที่จุดปลายบริการสร้างขึ้นควรกลับมาในการตอบกลับ ฉันไม่สามารถเข้าใจได้ว่าทำไมคุณถึงส่งการเปลี่ยนเส้นทางไปยังผู้ใช้ Angular หรือ JQuery SPA ซึ่งน่าจะเป็นคำตอบเท่านั้นและไม่สามารถหรือไม่ดำเนินการใด ๆ ในการเปลี่ยนเส้นทาง สิ่งที่ฉันต้องการจะทำคือการตั้งค่าตัวจัดการข้อผิดพลาดทั่วโลกที่สามารถยกเว้น - อย่างใดอย่างหนึ่งโยนออกมาจากวิธีการทำแผนที่การร้องขอหรือสร้างขึ้นโดยอัตโนมัติโดยฤดูใบไม้ผลิ (404 ถ้าไม่พบวิธีจัดการสำหรับลายเซ็นเส้นทางขอ) …

15
Java 8: Lambda-Streams, กรองตามวิธีการยกเว้น
ฉันมีปัญหาในการทดลองใช้แลมบ์ดานิพจน์ของ Java 8 โดยปกติแล้วจะใช้งานได้ดี แต่ตอนนี้ฉันมีวิธีการที่ใช้IOExceptionแล้ว เป็นการดีที่สุดถ้าคุณดูรหัสต่อไปนี้: class Bank{ .... public Set<String> getActiveAccountNumbers() throws IOException { Stream<Account> s = accounts.values().stream(); s = s.filter(a -> a.isActive()); Stream<String> ss = s.map(a -> a.getNumber()); return ss.collect(Collectors.toSet()); } .... } interface Account{ .... boolean isActive() throws IOException; String getNumber() throws IOException; .... } ปัญหาคือมันไม่ได้รวบรวมเพราะฉันต้องจับข้อยกเว้นที่เป็นไปได้ของ isActive- …

2
ฉันจะสร้างข้อยกเว้นใหม่ใน Javascript ได้อย่างไร แต่เก็บสแต็คไว้?
ใน Javascript สมมติว่าฉันต้องการดำเนินการล้างข้อมูลเมื่อเกิดข้อยกเว้น แต่ให้ข้อยกเว้นดำเนินการต่อไปเพื่อกระจายสแต็กเช่น: try { enterAwesomeMode(); doRiskyStuff(); // might throw an exception } catch (e) { leaveAwesomeMode(); throw e; } doMoreStuff(); leaveAwesomeMode(); ปัญหาของรหัสนี้คือการจับและ rethrowing ข้อยกเว้นทำให้ข้อมูลการติดตามสแต็กถึงจุดนั้นหายไปดังนั้นหากข้อผิดพลาดถูกดักจับในภายหลังอีกครั้งสูงขึ้นบนสแต็กการติดตามสแต็กจะลงไปที่ -โยน. สิ่งนี้แย่เพราะมันหมายความว่ามันไม่มีฟังก์ชั่นที่ทำให้เกิดข้อยกเว้น ตามที่ปรากฎลอง .. ในที่สุดก็มีพฤติกรรมเหมือนกันใน Chrome อย่างน้อย (นั่นคือไม่ใช่การโยนซ้ำที่เป็นปัญหาอย่างแม่นยำ แต่มีตัวจัดการบล็อกข้อยกเว้นอยู่เลย) ไม่มีใครรู้วิธีที่จะ rethrow ข้อยกเว้นใน Javascript แต่รักษาร่องรอยสแต็คที่เกี่ยวข้องกับมันได้หรือไม่ ความล้มเหลวนั้นวิธีการเกี่ยวกับคำแนะนำสำหรับวิธีอื่น ๆ ในการเพิ่มตัวจัดการการล้างข้อมูลบนข้อยกเว้นที่ปลอดภัยขณะเดียวกันก็จับการติดตามสแต็กที่สมบูรณ์เมื่อมีข้อยกเว้นเกิดขึ้น ขอบคุณสำหรับคำแนะนำใด ๆ :)

6
ในที่สุดบล็อกจะทำงานแม้ว่าคุณจะมีข้อยกเว้นใหม่หรือไม่?
ในรหัสนี้จะsomeVarถูกตั้งค่าแม้ว่าบล็อก catch จะถูกดำเนินการและข้อยกเว้นที่สองจะถูกโยนทิ้ง? public void someFunction() throws Exception { try { //CODE HERE } catch (Exception e) { Log.e(TAG, "", e); throw new Exception(e); } finally { this.someVar= true; } }

8
ดีกว่าที่จะ 'ลอง' บางอย่างและตรวจจับข้อยกเว้นหรือทดสอบว่าเป็นไปได้ก่อนเพื่อหลีกเลี่ยงข้อยกเว้นหรือไม่?
ฉันควรทดสอบifสิ่งที่ถูกต้องหรือเพียงtryเพื่อทำและตรวจจับข้อยกเว้น? มีเอกสารประกอบที่ระบุว่าควรใช้วิธีเดียวหรือไม่? pythonicทางเดียวมากกว่าหรือไม่? ตัวอย่างเช่นฉันควร: if len(my_list) >= 4: x = my_list[3] else: x = 'NO_ABC' หรือ: try: x = my_list[3] except IndexError: x = 'NO_ABC' ความคิดบางอย่าง ... PEP 20พูดว่า: ข้อผิดพลาดไม่ควรผ่านไปอย่างเงียบ ๆ เว้นแต่จะปิดเสียงไว้อย่างชัดเจน ควรใช้ a tryแทนการifตีความว่าเป็นข้อผิดพลาดที่ผ่านไปอย่างเงียบ ๆ หรือไม่? และถ้าเป็นเช่นนั้นคุณจะปิดเสียงโดยใช้วิธีนี้อย่างชัดเจนหรือไม่ ฉันไม่ได้หมายถึงสถานการณ์ที่คุณสามารถทำได้เพียง 1 ทางเท่านั้น ตัวอย่างเช่น: try: import foo except ImportError: import baz

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