ส่วนต่อท้ายข้อยกเว้นเกี่ยวกับข้อยกเว้นใน java


19

การระบุคำต่อท้ายของข้อยกเว้นในคลาสข้อยกเว้นรู้สึกเหมือนมีกลิ่นรหัสให้ฉัน (ข้อมูลที่ซ้ำซ้อน - ส่วนที่เหลือของชื่อแสดงถึงสถานะข้อผิดพลาดและสืบทอดมาจากข้อยกเว้น) อย่างไรก็ตามมันก็ดูเหมือนว่าทุกคนทำและดูเหมือนว่าจะเป็นแนวปฏิบัติที่ดี

ฉันกำลังมองหาที่จะเข้าใจว่าทำไมการปฏิบัติที่ดีนี้

ฉันเคยเห็นและอ่านคำถามแล้วว่าทำไมข้อยกเว้นมักจะมีข้อยกเว้นต่อท้ายในชื่อชั้นเรียน

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

หากเรานำตัวอย่างจากคำถามก่อนหน้านี้ - อาจมีคลาสใน java ด้วยชื่อFileNoFoundที่ไม่มีข้อยกเว้นหรือไม่ หากมีอาจเป็นไปได้หรือไม่ที่รับประกันว่าจะได้รับการรับรองด้วยExceptionหรือไม่

การดูลำดับชั้นอย่างรวดเร็วในสุริยุปราคาExceptionนั่นเองส่วนใหญ่ของพวกเขามีส่วนต่อท้ายของข้อยกเว้น แต่มีข้อยกเว้นเล็กน้อย javassistเป็นตัวอย่างของห้องสมุดที่ดูเหมือนว่าจะมีข้อยกเว้นบางประการโดยไม่ต้องต่อท้ายด้วย - เช่นBadByteCode, BadHttpRequestฯลฯ

BouncyCastle เป็น lib อื่นที่มีข้อยกเว้นเช่น CompileError

ฉันไปรอบ ๆ ด้วยข้อมูลเล็กน้อยในเรื่อง


2
"ข้อยกเว้นทั้งหมดควรมีExceptionคำต่อท้ายหรือเราควรสร้างข้อยกเว้นสำหรับข้อยกเว้นพิเศษหรือไม่" ;)
tdammers

2
ข้อผิดพลาดจริงเป็นเหมือนข้อยกเว้น (ดู OutOfMemoryError) แต่พวกเขามีความหมายสำหรับสิ่งที่ยากที่จะกู้คืนจาก (เพื่อให้คุณแทบจะไม่เคยจัดการกับพวกเขา)
วงล้อประหลาด

1
นอกจากนี้ฉันได้ยินมาว่าในฐานะกฎทั่วไป 'คลาสควรเป็นคำนามและวิธีการควรเป็นคำกริยา (การกระทำ)' FileNotFound ArrayIndexOutOfBoundsและOutOfMemoryมีข้อสังเกตเพิ่มเติม / รายละเอียด Exceptionแต่จะนำไปใช้แล้วเป็นรูปธรรม
MikeTheLiar

คำตอบ:


27

คำตอบของ Landei เป็นคำตอบที่ดี แต่ก็มีคำตอบไวยกรณ์ ชื่อชั้นควรจะเป็นคำนาม "OutOfMemory" คืออะไร "FileNotFound" คืออะไร หากคุณคิดว่า "ข้อยกเว้น" เป็นคำนามคำอธิบายจะเป็นคำคุณศัพท์ที่ระบุ มันไม่เพียงใดก็เป็นException FileNotFoundExceptionคุณไม่จำเป็นต้องจับOutOfMemoryอะไรมากกว่าที่คุณไปที่ร้านเพื่อซื้อ "สีฟ้า"

สิ่งนี้จะปรากฏขึ้นหากคุณอ่านรหัสของคุณเป็นประโยค: " Tryกำลังทำ ... และcatch OutOfMemory Exceptions"


1
ในการอ้างอิงบทความ "พยายามใช้คำนามเพราะปกติแล้วคลาสจะเป็นตัวแทนของบางสิ่งในโลกแห่งความเป็นจริง" แต่ข้อยกเว้นอยู่ในกรณีนี้หรือไม่? สำหรับฉันพวกเขาเป็นเหมือนสิ่งประดิษฐ์การเขียนโปรแกรมแทนข้อความแสดงข้อผิดพลาด "คุณจะได้รับOutOfMemoryข้อยกเว้น" อ่านได้ดีกว่า "คุณจะได้รับOutOfMemoryExceptionข้อยกเว้น" ใช่ไหม
greg0ire

1
@ greg0ire - คุณควรลองเป็น "คุณจะได้รับOutOfMemoryException" ที่กล่าวว่าเรายังมีหมายเลข PIN และเครื่องเอทีเอ็มเพื่อให้ข้อยกเว้น OOME จะไม่เป็นที่ผิดปกติ
Bobson

ฉันคิดว่าจุดที่คุณกำลังทำอยู่ที่นี่เป็นสิ่งที่ดีที่สุดจริงๆ (สิ่งที่เกี่ยวกับความขัดแย้งของชื่อไม่ได้ถืออีกต่อไปขอบคุณสำหรับเนมสเปซอย่างน้อยเป็น php) ฉันมีสิ่งที่จะพูดเกี่ยวกับสิ่งนี้เพิ่มเติมและจะโพสต์คำตอบในไม่ช้า
greg0ire

ทำ! คุณคิดอย่างไร?
greg0ire

@Bobson ผมขอแนะนำให้อ่านราชอาณาจักรคำนาม เราไม่ต้องการทุกสิ่งที่จะเป็นคำนาม ทำไม "คุณจะได้รับOutOfMemoryException" เมื่อมันสามารถเป็น "คุณมีหน่วยความจำไม่เพียงพอ"? เราไม่ได้ใช้Classคำต่อท้าย ( DogClass, CatClass, XmlReaderClass, ... )
Matthieu Napoli

6

ผมคิดว่าข้อยกเว้น (และข้อผิดพลาดและทฤษฎีอื่น ๆThrowables) มีความแตกต่างจากสิ่งที่ต้องการการเชื่อมต่อหรือ enums (ซึ่งมักจะไม่นำมาใช้เป็นคำต่อท้าย): พวกเขามักจะมีวัตถุประสงค์ที่ชัดเจนมากและ จำกัด พวกเขาจะใช้กับภาษาโครงสร้างเฉพาะ ( try, catch, throw, throws) และปฏิบัติตามกฎพิเศษ (เช่นการตรวจสอบเทียบกับข้อยกเว้นไม่ถูกตรวจสอบไม่มียาชื่อสามัญ) ในแบบที่พวกเขาไม่ได้เป็นเพียงชั้นเรียนที่เกิดขึ้นที่จะใช้เป็นข้อยกเว้น แต่กลไกการยกเว้นที่นำมาใช้โดยวิธีการเรียน

ดังนั้นหากคุณจัดการกับข้อยกเว้นและจำไม่ได้ว่าเป็นเช่นนี้มักจะมีอะไรผิดปกติอย่างมาก (ซึ่งไม่ใช่กรณีสำหรับสิ่งต่าง ๆ เช่น enums หรืออินเทอร์เฟซ) ดังนั้นฉันคิดว่าความแตกต่างเหล่านี้กับคลาส "ปกติ" นั้นใหญ่พอที่จะเรียกเบาะแสที่มองเห็นได้


1
ฟังดูขัดแย้งกับตัวฉัน หากข้อยกเว้นนั้นพิเศษและถูกใช้ในรูปแบบพิเศษและเป็นที่จดจำได้อย่างชัดเจนทำไมคุณต้องมีเงื่อนงำที่เป็นภาพ
Michael Borgwardt

@MichaelBorgwardt - ฉันคิดว่าเขาพูดว่าเพราะพวกเขาพิเศษและใช้ในรูปแบบพิเศษพวกเขาควรมีเงื่อนงำภาพที่เป็นที่รู้จักอย่างชัดเจน ที่ถูกกล่าวว่าฉันไม่ทราบว่าคุณสามารถโยนสิ่งที่ไม่ได้รับมาจากExceptionใน Java - คุณไม่สามารถใน C # ถ้าคุณทำไม่ได้ฉันก็ไม่สามารถนึกถึงสถานการณ์ที่คุณจะ "จัดการกับข้อยกเว้นและ [ไม่] จำมันได้"
Bobson

คุณไม่สามารถโยนสิ่งที่ไม่ใช่Throwableใน Java ได้เช่นกัน อย่างไรก็ตามคุณอาจจัดการกับข้อยกเว้นไม่เพียง แต่ในtry- การcatchตั้งค่าเช่นคุณอาจรวบรวมข้อยกเว้นเมื่อคุณทำการตรวจสอบบางอย่างสำหรับวัตถุที่ซับซ้อน (เมื่อคุณต้องการทราบปัญหาที่เกี่ยวข้องทั้งหมดไม่ใช่เฉพาะปัญหาแรก) ในกรณีเช่นนี้คุณควรจะทราบว่าคุณสามารถเช่นเรื่องการโยนสิ่งที่คุณมีในรายการของคุณดังนั้นมันจะดีที่จะเรียกพวกเขาคือแทนValidationIssue ValidationException
Landei

0

อย่างไรก็ตามมันก็ดูเหมือนว่าทุกคนทำและดูเหมือนว่าจะเป็นแนวปฏิบัติที่ดี

ใช่ทุกคนทำได้จริง ๆ ดังนั้นมันจึงเป็นการฝึกซ้อม แต่มันก็ยังดีอยู่ใช่ไหม หลายคนกำลังตั้งคำถามว่า:

  • http://mnapoli.fr/approaching-coding-style-rationally/ (ส่วนต่อท้ายข้อยกเว้น§บริบท: php)
  • วิดีโอที่เชื่อมโยง, https://vimeo.com/album/2661665/video/74316116 (ข้ามไปที่ 53:00, บริบท: php), เป็นแรงบันดาลใจให้กับบทความและชี้ให้เห็นว่าทุกครั้งที่คุณใช้ข้อยกเว้นคุณมีคำหลัก ที่แสดงให้เห็นแล้วว่าเป็นข้อยกเว้นในบริเวณใกล้เคียง
  • http://verraes.net/2013/10/verbs-in-class-names/แสดงให้เห็นว่าคำสั่งในคำตอบของ @Bobson อาจไม่สมบูรณ์และทำให้ประเด็นที่บางครั้งคำต่อท้ายเป็นสิ่งที่ดีสำหรับแอปพลิเคชันหรือ ข้อยกเว้นระดับโครงสร้างพื้นฐานและบางครั้งคุณควรพยายามบันทึกอักขระที่ต่อท้ายยาวนี้เพื่อแสดงสิ่งที่แม่นยำและมีความหมายมากขึ้น จุดนี้เหมาะสมถ้าคุณใช้ภาษาที่วัฒนธรรมใช้ข้อยกเว้นสำหรับการละเมิดกฎเกณฑ์ทางธุรกิจ
  • SO เชื่อมโยงคุณให้จุดที่ทำให้เกิดความขัดแย้งเกี่ยวกับชื่อ แต่ตอนนี้เรามี namespaces, เราไม่?

นี่คือคำถามjavaไม่ใช่phpหนึ่ง สำนวนต่างจากภาษา ที่กล่าวว่าฉันไม่เห็นด้วยอย่างยิ่งกับคำพูดนี้จากลิงค์ที่สามของคุณ: "ข้อยกเว้นสามารถคล้ายกับเหตุการณ์ ... ด้วยความแตกต่างเล็กน้อยว่าเป็นเหตุการณ์ที่ไม่พึงประสงค์คำเตือนว่าการดำเนินการบางอย่างไม่สอดคล้องกับกฎธุรกิจที่ มีผล " บางที PHP อาจจะแตกต่างกันในเรื่องนี้ แต่ในใจของฉันข้อยกเว้นควรจะพิเศษ หากกฎทางธุรกิจละเมิดตามที่คาดหวังตรรกะปกติของคุณควรจัดการ - ไม่ใช่ข้อยกเว้นสำหรับพฤติกรรมปกติ
Bobson

คุณอาจจะได้รับสิทธิในการที่จะแตกต่างกันไปบนพื้นฐานภาษาต่อภาษา: ดูหัวข้อนี้เกี่ยวกับงูหลาม: gossamer-threads.com/lists/python/python/796627 php และ python ชัดเจนว่าไม่ได้เน้นไปที่ประสิทธิภาพซึ่งอาจเป็นเหตุผลว่าทำไมความแตกต่างนี้กับ java (ซึ่งเน้นไปที่ประสิทธิภาพใช่มั้ย) หากคุณมีหลายเลเยอร์ที่จะข้ามในสแต็กการโทรของคุณก่อนที่จะอยู่ในระดับที่เหมาะสมเพื่อจัดการการละเมิดกฎธุรกิจอย่างถูกต้องข้อยกเว้นเป็น IMO ที่ดีที่สุด นอกจากนี้ยังทำให้ประเภทผลตอบแทนสอดคล้องกันมากขึ้น (คุณกลับมาเป็นประเภทเดิมเสมอไม่ใช่เท็จหรือจริง) ฉันจะแก้ไขคำตอบของฉันในบัญชี
greg0ire
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.