มีข้อยกเว้นที่เป็นข้อผิดพลาดของการปิดกั้น
แรกของทุกวิธีที่ดีที่สุดที่ควรจะเป็นไม่ได้โยนข้อยกเว้นสำหรับชนิดของข้อผิดพลาดใด ๆ เว้นแต่จะเป็นข้อผิดพลาดการบล็อก
หากข้อผิดพลาดคือการบล็อกแล้วโยนข้อยกเว้น เมื่อโยนข้อยกเว้นไปแล้วก็ไม่จำเป็นต้องซ่อนเพราะมันยอดเยี่ยม แจ้งให้ผู้ใช้ทราบเกี่ยวกับเรื่องนี้ (คุณควรจัดรูปแบบข้อยกเว้นทั้งหมดใหม่ให้เป็นสิ่งที่มีประโยชน์ต่อผู้ใช้ใน UI)
งานของคุณในฐานะนักพัฒนาซอฟต์แวร์คือการพยายามป้องกันกรณีพิเศษที่พารามิเตอร์หรือสถานการณ์รันไทม์บางอย่างอาจจบลงด้วยข้อยกเว้น นั่นคือข้อยกเว้นต้องไม่ถูกปิด แต่เหล่านี้จะต้องหลีกเลี่ยง
ตัวอย่างเช่นถ้าคุณรู้ว่าบางจำนวนเต็มป้อนข้อมูลอาจจะมาพร้อมกับรูปแบบที่ไม่ถูกต้องให้ใช้แทนint.TryParse
int.Parse
มีหลายกรณีที่คุณสามารถทำสิ่งนี้แทนที่จะพูดว่า "ถ้ามันล้มเหลวเพียงแค่โยนข้อยกเว้น"
โยนข้อยกเว้นมีราคาแพง
หากหลังจากทั้งหมดยกเว้นจะโยนแทนการเขียนข้อยกเว้นที่จะบันทึกเมื่อได้รับการโยนหนึ่งของการปฏิบัติที่ดีที่สุดคือการจับมันในโอกาสแรกจัดการข้อยกเว้น ตัวอย่างเช่น:
- ASP.NET: Global.asax Application_Error
- อื่น ๆ : เหตุการณ์ AppDomain.FirstChanceException
ท่าทางของฉันคือลอง / จับในท้องถิ่นเหมาะกว่าสำหรับจัดการกรณีพิเศษที่คุณอาจแปลข้อยกเว้นเป็นอีกกรณีหนึ่งหรือเมื่อคุณต้องการ "ปิดเสียง" สำหรับกรณีที่พิเศษมากมากมากและพิเศษมาก (ข้อผิดพลาดของไลบรารี โยนข้อยกเว้นที่ไม่เกี่ยวข้องที่คุณต้องการปิดเสียงเพื่อแก้ไขข้อผิดพลาดทั้งหมด)
สำหรับกรณีที่เหลือ:
- พยายามหลีกเลี่ยงข้อยกเว้น
- หากเป็นไปไม่ได้: ตัวจัดการข้อยกเว้นโอกาสแรก
- หรือใช้มุมมอง PostSharp (AOP)
ตอบกลับ @thewhiteambit ในบางความคิดเห็น ...
@thewhiteambit กล่าวว่า:
ข้อยกเว้นไม่ใช่ข้อผิดพลาดร้ายแรงพวกเขาเป็นข้อยกเว้น! บางครั้งพวกเขาไม่ได้มีข้อผิดพลาด แต่ให้พิจารณาข้อผิดพลาดที่ร้ายแรงคือความเข้าใจที่ผิด ๆ ว่าข้อยกเว้นคืออะไร
ก่อนอื่นข้อยกเว้นไม่สามารถเป็นข้อผิดพลาดได้อย่างไร
- ไม่มีการเชื่อมต่อฐานข้อมูล => ข้อยกเว้น
- รูปแบบสตริงไม่ถูกต้องในการแยกวิเคราะห์บางชนิด => ข้อยกเว้น
- การพยายามแยกวิเคราะห์ JSON และในขณะที่อินพุตไม่ใช่ JSON => ข้อยกเว้น
- อาร์กิวเมนต์
null
ในขณะที่วัตถุถูกคาดหวัง => ข้อยกเว้น
- ห้องสมุดบางแห่งมีข้อผิดพลาด => ส่งข้อยกเว้นที่ไม่คาดคิด
- มีการเชื่อมต่อซ็อกเก็ตและจะถูกตัดการเชื่อมต่อ จากนั้นคุณลองส่งข้อความ => ข้อยกเว้น
- ...
เราอาจแสดงรายการ 1 พันกรณีเมื่อมีข้อผิดพลาดเกิดขึ้นและหลังจากนั้นทุกกรณีที่เป็นไปได้จะเป็นข้อผิดพลาด
ข้อยกเว้นคือข้อผิดพลาดเนื่องจากในตอนท้ายของวันเป็นวัตถุที่รวบรวมข้อมูลการวินิจฉัย - มีข้อความและเกิดขึ้นเมื่อมีบางสิ่งผิดปกติ
ไม่มีใครจะยกเว้นเมื่อไม่มีกรณีพิเศษ ข้อยกเว้นควรจะปิดกั้นข้อผิดพลาดเพราะเมื่อพวกเขากำลังโยนถ้าคุณไม่พยายามที่จะตกอยู่ในการใช้งานลอง / จับและข้อยกเว้นในการดำเนินการควบคุมการไหลของพวกเขาหมายถึงการประยุกต์ใช้ / บริการของคุณจะหยุดการดำเนินการที่ได้ลงนามในกรณีพิเศษ
นอกจากนี้ผมขอแนะนำให้ทุกคนที่จะตรวจสอบล้มเหลวอย่างรวดเร็วกระบวนทัศน์การตีพิมพ์โดยมาร์ตินฟาวเลอร์ (และเขียนโดยจิมชอร์) นี่คือวิธีที่ฉันเข้าใจวิธีจัดการกับข้อยกเว้นอยู่เสมอก่อนที่ฉันจะมาถึงเอกสารนี้เมื่อไม่นานมานี้
[... ] พิจารณาข้อผิดพลาดที่ร้ายแรงคือความเข้าใจผิดอย่างสมบูรณ์เกี่ยวกับข้อยกเว้น
โดยปกติแล้วข้อยกเว้นจะลดขั้นตอนการดำเนินการบางอย่างและพวกเขาจะจัดการแปลงให้เป็นข้อผิดพลาดที่มนุษย์เข้าใจได้ ดังนั้นจึงดูเหมือนว่าข้อยกเว้นจริงเป็นกระบวนทัศน์ที่ดีกว่าในการจัดการกรณีข้อผิดพลาดและทำงานกับพวกเขาเพื่อหลีกเลี่ยงความผิดพลาดของแอปพลิเคชัน / บริการที่สมบูรณ์และแจ้งให้ผู้ใช้ / ผู้บริโภคทราบว่ามีบางอย่างผิดปกติ
คำตอบเพิ่มเติมเกี่ยวกับ @thewhiteambit กังวล
ตัวอย่างเช่นในกรณีที่การเชื่อมต่อฐานข้อมูลหายไปโปรแกรมสามารถทำการเขียนต่อไปยังไฟล์โลคัลและส่งการเปลี่ยนแปลงไปยังฐานข้อมูลเมื่อมันพร้อมใช้งานอีกครั้ง String-To-Number ที่ไม่ถูกต้องของคุณอาจพยายามแยกวิเคราะห์อีกครั้งด้วยการตีความภาษาท้องถิ่นในข้อยกเว้นเช่นเมื่อคุณลองภาษาอังกฤษเริ่มต้นเพื่อแยกวิเคราะห์ ("1,5") ล้มเหลวและคุณลองด้วยการแปลภาษาเยอรมันอีกครั้ง ดีเพราะเราใช้เครื่องหมายจุลภาคแทนจุดเป็นตัวคั่น คุณเห็นข้อยกเว้นเหล่านี้จะต้องไม่ปิดกั้น แต่จะต้องจัดการข้อยกเว้นบางอย่างเท่านั้น
หากแอปของคุณอาจทำงานออฟไลน์โดยไม่มีข้อมูลอยู่ในฐานข้อมูลคุณไม่ควรใช้ข้อยกเว้นเนื่องจากการนำโฟลว์ควบคุมไปใช้โดยtry/catch
ถือเป็นรูปแบบการต่อต้าน งานออฟไลน์เป็นกรณีการใช้งานที่เป็นไปได้ดังนั้นคุณจึงใช้ขั้นตอนการควบคุมเพื่อตรวจสอบว่าฐานข้อมูลสามารถเข้าถึงได้หรือไม่คุณไม่ต้องรอจนกว่าจะไม่สามารถเข้าถึงได้
แยกสิ่งนี้ยังมีกรณีที่คาดว่า ( ไม่ EXCEPTIONAL CASE ) หากคุณคาดหวังสิ่งนี้คุณจะไม่ใช้ข้อยกเว้นเพื่อควบคุมโฟลว์! . คุณได้รับข้อมูลเมตาจากผู้ใช้เพื่อทราบว่าวัฒนธรรมของเขา / เธอคืออะไรและคุณใช้ตัวจัดรูปแบบสำหรับสิ่งนี้! .NET สนับสนุนนี้และสภาพแวดล้อมอื่น ๆ มากเกินไปและข้อยกเว้นเพราะจำนวนการจัดรูปแบบจะต้องหลีกเลี่ยงถ้าคุณคาดว่าจะมีการใช้งานวัฒนธรรมที่เฉพาะเจาะจงของแอพลิเคชัน
ข้อยกเว้นที่ไม่สามารถจัดการได้มักจะกลายเป็นข้อผิดพลาด แต่ข้อยกเว้นนั้นไม่ใช่ codeproject.com/Articles/15921/Not-All-Exceptions-Are-Errors
บทความนี้เป็นเพียงความคิดเห็นหรือมุมมองของผู้เขียน
เนื่องจาก Wikipedia สามารถเป็นเพียงความเห็นของผู้เขียนบทความฉันจะไม่พูดว่ามันเป็นความเชื่อแต่ตรวจสอบสิ่งที่การเข้ารหัสโดยบทความยกเว้นกล่าวว่าบางแห่งในย่อหน้า:
[... ] การใช้ข้อยกเว้นเหล่านี้เพื่อจัดการข้อผิดพลาดเฉพาะที่เกิดขึ้นต่อโปรแกรมเรียกว่าการเข้ารหัสโดยข้อยกเว้น รูปแบบการต่อต้านนี้สามารถลดประสิทธิภาพของซอฟต์แวร์และประสิทธิภาพในการบำรุงรักษาได้อย่างรวดเร็ว
มันยังบอกว่าบางแห่ง:
การใช้ข้อยกเว้นไม่ถูกต้อง
บ่อยครั้งที่การเข้ารหัสโดยข้อยกเว้นสามารถนำไปสู่ปัญหาเพิ่มเติมในซอฟต์แวร์ที่มีการใช้ข้อยกเว้นไม่ถูกต้อง นอกเหนือจากการใช้การจัดการข้อยกเว้นสำหรับปัญหาที่ไม่ซ้ำการใช้ข้อยกเว้นที่ไม่ถูกต้องจะดำเนินการต่อไปโดยการเรียกใช้งานโค้ดแม้ว่าจะเกิดข้อยกเว้นขึ้นก็ตาม วิธีการเขียนโปรแกรมที่ไม่ดีนี้มีลักษณะคล้ายกับวิธี goto ในภาษาซอฟต์แวร์จำนวนมาก แต่เกิดขึ้นหลังจากตรวจพบปัญหาในซอฟต์แวร์เท่านั้น
สุจริตฉันเชื่อว่าซอฟต์แวร์ที่ไม่สามารถพัฒนาไม่ได้ใช้กรณีอย่างจริงจัง ถ้าคุณรู้ว่า ...
- ฐานข้อมูลของคุณสามารถออฟไลน์ ...
- ไฟล์บางไฟล์สามารถถูกล็อค ...
- การจัดรูปแบบบางอย่างอาจไม่รองรับ ...
- การตรวจสอบโดเมนบางอย่างอาจล้มเหลว ...
- แอปของคุณควรทำงานในโหมดออฟไลน์ ...
- สิ่งที่ใช้กรณี ...
... คุณจะไม่ใช้ข้อยกเว้นสำหรับสิ่งนั้น คุณจะรองรับกรณีการใช้งานเหล่านี้โดยใช้โฟลว์ควบคุมปกติ
และถ้าบางกรณีการใช้งานที่ไม่คาดคิดจะไม่ครอบคลุมถึงรหัสของคุณจะล้มเหลวอย่างรวดเร็วเพราะมันจะโยนข้อยกเว้น ขวาเพราะข้อยกเว้นเป็นกรณีพิเศษ
ในมืออื่น ๆ และในที่สุดก็บางครั้งคุณครอบคลุมกรณีพิเศษโยนข้อยกเว้นคาดว่าแต่คุณไม่ได้โยนพวกเขาในการดำเนินการควบคุมการไหล คุณทำเช่นนี้เพราะคุณต้องการแจ้งให้เลเยอร์ด้านบนทราบว่าคุณไม่รองรับกรณีการใช้งานบางอย่างหรือรหัสของคุณไม่สามารถทำงานกับข้อโต้แย้งหรือข้อมูล / คุณสมบัติสภาพแวดล้อมที่กำหนด