คำถามติดแท็ก exceptions

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

7
ทำไมไม่มีการสร้าง 'สุดท้าย' ใน C ++
การจัดการข้อยกเว้นใน C ++ นั้น จำกัด ให้ลอง / โยน / จับ ไม่เหมือนกับ Object Pascal, Java, C # และ Python แม้ใน C ++ 11 finallyโครงสร้างจะไม่ถูกนำมาใช้ ฉันได้เห็นวรรณกรรม C ++ จำนวนมากที่พูดถึง "ข้อยกเว้นรหัสปลอดภัย" Lippman เขียนว่ารหัสความปลอดภัยยกเว้นเป็นหัวข้อที่มีความสำคัญ แต่ขั้นสูงและยากเกินกว่าขอบเขตของไพรเมอร์ของเขา - ซึ่งดูเหมือนว่าบอกเป็นนัยว่ารหัสความปลอดภัยไม่ได้เป็นพื้นฐานของ C ++ Herb Sutter อุทิศ 10 บทในหัวข้อในภาษา C ++ อันยอดเยี่ยมของเขา! สำหรับฉันแล้วดูเหมือนว่าปัญหาต่าง ๆ ที่เกิดขึ้นเมื่อพยายามเขียน "รหัสที่ปลอดภัยยกเว้น" สามารถแก้ไขได้ค่อนข้างดีหากมีการใช้finallyงานโครงสร้างซึ่งทำให้โปรแกรมเมอร์สามารถมั่นใจได้ว่าแม้ในกรณีที่มีข้อยกเว้นโปรแกรมสามารถคืนค่าได้ ไปยังสถานะที่ปลอดภัยมั่นคงปราศจากการรั่วไหลใกล้กับจุดจัดสรรทรัพยากรและรหัสที่อาจเป็นปัญหา ในฐานะที่เป็นโปรแกรมเมอร์ …
57 c++  exceptions 

12
การจับข้อยกเว้นทั่วไปเป็นสิ่งที่ไม่ดีจริง ๆ หรือ
ฉันมักจะเห็นด้วยกับคำเตือนการวิเคราะห์รหัสส่วนใหญ่และฉันพยายามที่จะปฏิบัติตามพวกเขา อย่างไรก็ตามฉันมีเวลายากขึ้นกับสิ่งนี้: CA1031: อย่าตรวจจับชนิดข้อยกเว้นทั่วไป ฉันเข้าใจเหตุผลของกฎนี้ แต่ในทางปฏิบัติถ้าฉันต้องการที่จะทำสิ่งเดียวกันโดยไม่คำนึงถึงข้อยกเว้นที่ถูกโยนออกไปทำไมฉันต้องจัดการแต่ละอย่างโดยเฉพาะ? นอกจากนี้หากฉันจัดการข้อยกเว้นเฉพาะจะเกิดอะไรขึ้นถ้ารหัสที่ฉันเรียกจะเปลี่ยนแปลงเพื่อให้เกิดข้อยกเว้นใหม่ในอนาคต ตอนนี้ฉันต้องเปลี่ยนรหัสเพื่อจัดการข้อยกเว้นใหม่นั้น ในขณะที่ถ้าฉันเพียงแค่จับExceptionรหัสของฉันไม่ต้องเปลี่ยน ตัวอย่างเช่นถ้า Foo เรียกบาร์และ Foo จำเป็นต้องหยุดการประมวลผลโดยไม่คำนึงถึงประเภทของข้อยกเว้นที่เกิดจาก Bar มีข้อได้เปรียบอะไรบ้างในการระบุประเภทของข้อยกเว้นที่ฉันจับได้ อาจเป็นตัวอย่างที่ดีกว่า: public void Foo() { // Some logic here. LogUtility.Log("some message"); } public static void Log() { try { // Actual logging here. } catch (Exception ex) { // Eat it. Logging failures shouldn't …
56 c#  design  exceptions 

9
โยนข้อยกเว้นหรือให้รหัสล้มเหลว
ฉันสงสัยว่ามีข้อดีและข้อเสียต่อสไตล์นี้หรือไม่: private void LoadMaterial(string name) { if (_Materials.ContainsKey(name)) { throw new ArgumentException("The material named " + name + " has already been loaded."); } _Materials.Add( name, Resources.Load(string.Format("Materials/{0}", name)) as Material ); } วิธีการนั้นควรnameจะเรียกใช้เพียงครั้งเดียวเท่านั้น จะโยนยกเว้นถ้ามันจะถูกเรียกว่าหลายครั้งเหมือนกัน_Materials.Add() nameผลที่ตามมาคือการป้องกันซ้ำซ้อนอย่างสมบูรณ์หรือมีประโยชน์ที่เห็นได้ชัดน้อยลงหรือไม่? นั่นคือ C #, Unity หากใครสนใจ
52 exceptions 

3
ทำไมข้อกำหนดข้อยกเว้นไม่ดี?
ย้อนกลับไปที่โรงเรียนเมื่อ 10 ปีก่อนพวกเขาสอนให้คุณใช้เครื่องมือระบุข้อยกเว้น เนื่องจากพื้นหลังของฉันเป็นหนึ่งในนั้นโปรแกรมเมอร์ Torvaldish C ที่หลีกเลี่ยงการดื้อ C ++ ยกเว้นว่าถูกบังคับให้ฉันลงเอยด้วยการใช้ C ++ เป็นระยะ ๆ และเมื่อฉันยังคงใช้ตัวระบุข้อยกเว้นเนื่องจากนั่นคือสิ่งที่ฉันได้รับการสอน อย่างไรก็ตามโปรแกรมเมอร์ C ++ ส่วนใหญ่ดูเหมือนจะขมวดคิ้วเมื่อตัวระบุข้อยกเว้น ฉันได้อ่านการอภิปรายและข้อโต้แย้งต่าง ๆ จาก C ++ ผู้เชี่ยวชาญด้านการเช่นนี้ เท่าที่ฉันเข้าใจมันเดือดลงถึงสามสิ่ง: ตัวระบุข้อยกเว้นใช้ระบบชนิดที่ไม่สอดคล้องกับภาษาที่เหลือ ("ระบบชนิดเงา") หากฟังก์ชั่นของคุณที่มีตัวระบุข้อยกเว้นมีข้อผิดพลาดอื่นใดนอกจากสิ่งที่คุณได้ระบุไว้โปรแกรมจะถูกยกเลิกในรูปแบบที่ไม่ดีและไม่คาดคิด ตัวระบุข้อยกเว้นจะถูกลบออกในมาตรฐาน C ++ ที่กำลังจะมาถึง ฉันพลาดอะไรบางอย่างที่นี่หรือนี่คือเหตุผลทั้งหมดเหรอ? ความคิดเห็นของฉัน: เกี่ยวกับ 1): แล้วอะไรล่ะ C ++ อาจเป็นภาษาการเขียนโปรแกรมที่ไม่สอดคล้องกันมากที่สุดที่เคยมีมา เรามีมาโคร, goto / label, horde (hoard?) ของพฤติกรรมที่ไม่ได้กำหนด - / …

6
วิธีแก้ปัญหาสำหรับข้อยกเว้นที่ตรวจสอบด้วย Java
ฉันขอขอบคุณฟีเจอร์ Java 8 ใหม่มากมายเกี่ยวกับ lambdas และอินเตอร์เฟสเมธอดดีฟอลต์ แต่ฉันยังคงเบื่อกับข้อยกเว้นที่ตรวจสอบ ตัวอย่างเช่นหากฉันต้องการแสดงรายการเขตข้อมูลที่มองเห็นได้ทั้งหมดของวัตถุที่ฉันต้องการจะเขียนสิ่งนี้: Arrays.asList(p.getClass().getFields()).forEach( f -> System.out.println(f.get(p)) ); แต่เนื่องจากgetวิธีการอาจมีข้อยกเว้นการตรวจสอบซึ่งไม่เห็นด้วยกับConsumerสัญญาอินเตอร์เฟซดังนั้นฉันต้องจับข้อยกเว้นนั้นและเขียนรหัสต่อไปนี้: Arrays.asList(p.getClass().getFields()).forEach( f -> { try { System.out.println(f.get(p)); } catch (IllegalArgumentException | IllegalAccessException ex) { throw new RuntimeException(ex); } } ); อย่างไรก็ตามในกรณีส่วนใหญ่ฉันแค่ต้องการยกเว้นจะถูกโยนเป็นRuntimeExceptionและให้โปรแกรมจัดการหรือไม่ยกเว้นโดยไม่มีข้อผิดพลาดในการรวบรวม ดังนั้นฉันต้องการแสดงความคิดเห็นของคุณเกี่ยวกับวิธีแก้ไขปัญหาการโต้เถียงของฉันสำหรับการตรวจสอบข้อยกเว้นที่น่ารำคาญ ด้วยเหตุนี้ฉันจึงสร้างส่วนต่อประสานConsumerCheckException<T>และฟังก์ชั่นยูทิลิตี้rethrow( อัปเดตตามความต้องการของความคิดเห็นของ Doval ) ดังต่อไปนี้: @FunctionalInterface public interface ConsumerCheckException<T>{ void accept(T elem) throws Exception; …

4
ทำไมตัววนซ้ำใน Python จึงทำให้เกิดข้อยกเว้น?
นี่คือไวยากรณ์สำหรับตัววนซ้ำใน Java (ค่อนข้างคล้ายไวยากรณ์ใน C #): Iterator it = sequence.iterator(); while (it.hasNext()) { System.out.println(it.next()); } ซึ่งทำให้รู้สึก นี่คือไวยากรณ์ที่เทียบเท่าใน Python: it = iter(sequence) while True: try: value = it.next() except StopIteration: break print(value) ฉันคิดว่ามีการใช้ข้อยกเว้นในกรณีพิเศษเท่านั้น ทำไมไพ ธ อนใช้ข้อยกเว้นเพื่อหยุดย้ำ?

4
ทำไมวิธีการไม่ควรโยนข้อยกเว้นที่ตรวจสอบหลายประเภท
เราใช้ SonarQube เพื่อวิเคราะห์โค้ด Java ของเราและมีกฎนี้ (ตั้งค่าเป็นวิกฤติ): วิธีการสาธารณะควรมีข้อยกเว้นที่ตรวจสอบได้มากที่สุดหนึ่งรายการ การใช้ข้อยกเว้นที่เลือกไว้จะบังคับให้ผู้เรียกใช้วิธีจัดการกับข้อผิดพลาดไม่ว่าจะโดยการเผยแพร่พวกเขาหรือโดยการจัดการพวกเขา สิ่งนี้ทำให้ข้อยกเว้นเหล่านั้นเป็นส่วนหนึ่งของ API ของวิธีการทั้งหมด เพื่อรักษาความซับซ้อนสำหรับผู้โทรที่เหมาะสมวิธีการไม่ควรมีข้อยกเว้นที่ตรวจสอบมากกว่าหนึ่งประเภท " อีกเล็กน้อยใน Sonar มีสิ่งนี้ : วิธีการสาธารณะควรมีข้อยกเว้นที่ตรวจสอบได้มากที่สุดหนึ่งรายการ การใช้ข้อยกเว้นที่เลือกไว้จะบังคับให้ผู้เรียกใช้วิธีจัดการกับข้อผิดพลาดไม่ว่าจะโดยการแพร่กระจายพวกเขาหรือโดยการจัดการพวกเขา สิ่งนี้ทำให้ข้อยกเว้นเหล่านั้นเป็นส่วนหนึ่งของ API ของวิธีการทั้งหมด เพื่อรักษาความซับซ้อนสำหรับผู้โทรที่เหมาะสมวิธีการไม่ควรมีข้อยกเว้นที่ตรวจสอบมากกว่าหนึ่งประเภท รหัสต่อไปนี้: public void delete() throws IOException, SQLException { // Non-Compliant /* ... */ } ควรได้รับการปรับสภาพใหม่เป็น: public void delete() throws SomeApplicationLevelException { // Compliant /* ... */ } …

8
ทำไมจึงต้องออกแบบภาษาสมัยใหม่โดยไม่มีกลไกการจัดการยกเว้น?
ภาษาสมัยใหม่หลายคนให้การจัดการข้อยกเว้นที่อุดมไปด้วยคุณสมบัติ แต่แอปเปิ้ลของการเขียนโปรแกรมภาษาสวิฟท์ไม่ได้ให้กลไกการจัดการข้อยกเว้น ขณะที่ฉันกำลังจมดิ่งอยู่ในข้อยกเว้นฉันมีปัญหาในการคิดสิ่งที่มันหมายถึง Swift มีคำยืนยันและแน่นอนว่ามีค่าตอบแทน แต่ฉันกำลังมีปัญหาในการนึกภาพว่าวิธีคิดตามข้อยกเว้นของฉันทำแผนที่โลกโดยไม่มีข้อยกเว้น (และสำหรับเรื่องนั้นทำไมโลกเช่นนี้เป็นที่น่าพอใจ ) มีสิ่งใดบ้างที่ฉันไม่สามารถทำได้ในภาษาอย่าง Swift ที่ฉันสามารถทำได้ด้วยข้อยกเว้น ฉันจะได้รับบางอย่างจากการสูญเสียข้อยกเว้น? ยกตัวอย่างเช่นฉันจะแสดงสิ่งที่ดีที่สุดได้อย่างไร try: operation_that_can_throw_ioerror() except IOError: handle_the_exception_somehow() else: # we don't want to catch the IOError if it's raised another_operation_that_can_throw_ioerror() finally: something_we_always_need_to_do() ในภาษา (ตัวอย่างเช่น Swift) ที่ไม่มีการจัดการข้อยกเว้น?

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

8
มีเหตุผลที่ถูกต้องหรือไม่ในการส่งคืนออบเจ็กต์ข้อยกเว้นแทนที่จะโยนมัน?
คำถามนี้มีวัตถุประสงค์เพื่อนำไปใช้กับภาษาการเขียนโปรแกรม OO ใด ๆ ที่รองรับการจัดการข้อยกเว้น; ฉันใช้ C # เพื่อเป็นตัวอย่างเท่านั้น มักจะมีข้อยกเว้นที่จะยกเมื่อมีปัญหาเกิดขึ้นว่ารหัสไม่สามารถจัดการได้ทันทีและจากนั้นจะถูกจับในcatchประโยคในสถานที่ที่แตกต่างกัน (มักจะเป็นกรอบสแต็คด้านนอก) ถาม:มีสถานการณ์ที่ถูกต้องตามกฎหมายหรือไม่ที่ข้อยกเว้นไม่ได้ถูกโยนทิ้งและจับได้ แต่กลับมาจากวิธีการแล้วส่งผ่านไปเป็นวัตถุข้อผิดพลาดหรือไม่? คำถามนี้เกิดขึ้นสำหรับฉันเพราะSystem.IObserver<T>.OnErrorวิธีของ. NET 4 แนะนำเพียงว่า: ข้อยกเว้นถูกส่งผ่านเป็นวัตถุข้อผิดพลาด ลองดูที่สถานการณ์อื่นการตรวจสอบ สมมติว่าฉันกำลังติดตามภูมิปัญญาดั้งเดิมและดังนั้นฉันจึงแยกแยะระหว่างประเภทวัตถุข้อผิดพลาดIValidationErrorและประเภทข้อยกเว้นแยกValidationExceptionที่ใช้เพื่อรายงานข้อผิดพลาดที่ไม่คาดคิด: partial interface IValidationError { } abstract partial class ValidationException : System.Exception { public abstract IValidationError[] ValidationErrors { get; } } ( System.Component.DataAnnotationsเนมสเปซทำอะไรที่ค่อนข้างคล้ายกัน) ประเภทเหล่านี้สามารถใช้งานได้ดังนี้: partial interface IFoo { } // an …

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

4
การเผยแพร่ข้อยกเว้น: เมื่อใดที่ฉันควรตรวจจับข้อยกเว้น
เมธอด A เรียกเมธอด B ซึ่งจะเรียกเมธอด C ไม่มีการจัดการข้อยกเว้นใน MethodB หรือ MethodC แต่มีข้อยกเว้นการจัดการใน MethodA ใน MethodC มีข้อยกเว้นเกิดขึ้น ตอนนี้ข้อยกเว้นนั้นทำให้เดือดร้อนขึ้นไปที่ MethodA ซึ่งจัดการมันอย่างเหมาะสม เกิดอะไรขึ้นกับสิ่งนี้? ในใจของฉันในบางจุดผู้เรียกจะเรียกใช้เมธอด B หรือ MethodC และเมื่อเกิดข้อยกเว้นขึ้นในวิธีการเหล่านั้นสิ่งที่จะได้รับจากการจัดการข้อยกเว้นภายในวิธีการเหล่านั้นซึ่งโดยพื้นฐานแล้วเป็นเพียงลอง / จับ / ในที่สุดบล็อก พวกเขาฟองขึ้นไปที่ callee? คำแถลงหรือความเห็นเป็นเอกฉันท์เกี่ยวกับการจัดการข้อยกเว้นคือการโยนเมื่อการดำเนินการไม่สามารถดำเนินการได้เนื่องจากข้อผิดพลาดนั้น ฉันเข้าใจ. แต่ทำไมไม่จับข้อยกเว้นเพิ่มเติมขึ้นโซ่แทนที่จะลอง / จับบล็อกจนสุด ฉันเข้าใจเมื่อคุณต้องการเพิ่มทรัพยากร นั่นเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง

11
ตัวแปรข้อผิดพลาดเป็นการต่อต้านรูปแบบหรือการออกแบบที่ดีหรือไม่?
เพื่อจัดการข้อผิดพลาดที่เป็นไปได้หลายอย่างที่ไม่ควรหยุดการทำงานฉันมีerrorตัวแปรที่ลูกค้าสามารถตรวจสอบและใช้เพื่อโยนข้อยกเว้น นี่เป็น Anti-Pattern หรือไม่ มีวิธีที่ดีกว่าในการจัดการกับเรื่องนี้? ตัวอย่างของสิ่งนี้คุณสามารถดูmysqli API ของ PHP สมมติว่าปัญหาการมองเห็น (ผู้เข้าถึงขอบเขตสาธารณะและส่วนตัวเป็นตัวแปรในคลาสหรือระดับโลกหรือไม่) ได้รับการจัดการอย่างถูกต้อง

4
Python ให้อภัยเทียบกับการอนุญาตและการพิมพ์ดีดเป็ด
ใน Python ฉันมักจะได้ยินว่าเป็นการ "ให้อภัย" ดีกว่า (ยกเว้นการจับ) แทนที่จะดีกว่า "ขออนุญาต" (การตรวจสอบประเภท / เงื่อนไข) ในเรื่องที่เกี่ยวกับการบังคับใช้การพิมพ์เป็ดใน Python มันคือสิ่งนี้ try: x = foo.bar except AttributeError: pass else: do(x) ดีกว่าหรือแย่กว่า if hasattr(foo, "bar"): do(foo.bar) else: pass ในแง่ของประสิทธิภาพการอ่าน "pythonic" หรือปัจจัยสำคัญอื่น ๆ

8
ฉันควรโยนข้อยกเว้นในกรณีที่มีค่าที่มีความหมายนอกช่วงหรือจัดการกับตัวเองหรือไม่?
ฉันได้เขียน struct ที่แสดงถึงพิกัดละติจูด / ลองจิจูด ค่าของพวกเขามีตั้งแต่ -180 ถึง 180 สำหรับ longtitudes และ 90 ถึง -90 สำหรับ lattitudes หากผู้ใช้งานของ struct นั้นให้คุณค่าแก่ฉันนอกช่วงนั้นฉันมี 2 ตัวเลือก: โยนข้อยกเว้น (อยู่นอกช่วง) แปลงค่าเป็นข้อ จำกัด เนื่องจากพิกัด -185 มีความหมาย (สามารถแปลงได้อย่างง่ายดายมากถึง +175 เหมือนกับพิกัดเชิงขั้ว) ฉันจึงยอมรับและแปลงได้ จะเป็นการดีกว่าหรือที่จะโยนข้อยกเว้นเพื่อบอกผู้ใช้ว่ารหัสของเขาให้คุณค่าที่ควรแก่ฉัน แก้ไข: ฉันรู้ถึงความแตกต่างระหว่าง lat / lng และพิกัด แต่ฉันต้องการทำให้มันง่ายขึ้นสำหรับการสนทนาที่ง่ายขึ้น - มันไม่ใช่ความคิดที่เจิดจ้าที่สุด

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