บทคัดย่อยกเว้นชนิดซุปเปอร์


17

หากการขว้างปาSystem.Exceptionถือว่าแย่มากทำไมไม่Exceptionทำabstractในตอนแรก?

ด้วยวิธีนี้มันเป็นไปไม่ได้ที่จะโทร:

throw new Exception("Error occurred.");

สิ่งนี้จะบังคับใช้การยกเว้นที่ได้รับเพื่อให้รายละเอียดเพิ่มเติมเกี่ยวกับข้อผิดพลาดที่เกิดขึ้น

ตัวอย่างเช่นเมื่อฉันต้องการให้ลำดับชั้นข้อยกเว้นที่กำหนดเองสำหรับห้องสมุดฉันมักจะประกาศคลาสฐานนามธรรมสำหรับข้อยกเว้นของฉัน:

public abstract class CustomExceptionBase : Exception
{
    /* some stuff here */
}

แล้วมีข้อยกเว้นบางอย่างที่มีจุดประสงค์เฉพาะเจาะจงมากขึ้น:

public class DerivedCustomException : CustomExceptionBase
{
    /* some more specific stuff here */
}

จากนั้นเมื่อเรียกเมธอดไลบรารี่ใด ๆ เราสามารถลอง / แทร็กบล็อคทั่วไปเพื่อดักจับข้อผิดพลาดที่มาจากไลบรารีโดยตรง:

try
{
    /* library calls here */
}
catch (CustomExceptionBase ex)
{
    /* exception handling */
}

นี่เป็นวิธีปฏิบัติที่ดีหรือไม่?

มันจะดีไหมถ้าExceptionถูกทำให้เป็นนามธรรม?

แก้ไข: จุดของฉันที่นี่คือแม้ว่าจะมีคลาสยกเว้นabstractคุณสามารถจับมันในบล็อก catch-all การทำให้เป็นนามธรรมเป็นเพียงวิธีห้ามมิให้โปรแกรมเมอร์เขียนข้อยกเว้น "กว้างเป็นพิเศษ" โดยปกติเมื่อคุณสมัครใจโยนข้อยกเว้นคุณควรรู้ว่ามันคืออะไรและทำไมมันเกิดขึ้น ดังนั้นบังคับให้โยนประเภทยกเว้นที่เฉพาะเจาะจงมากขึ้น


3
+1 "วิธีที่ดีที่สุดในการป้องกันการใช้งานที่ไม่ถูกต้องคือทำให้ใช้งานไม่ได้" - Scott Meyers
Steven Jeuris

3
"มันจะดีไหมถ้ามีข้อยกเว้นที่เป็นนามธรรม?" - ไม่อย่างเด็ดขาดเพราะรหัส. NET ที่มีอยู่ทั้งหมดซึ่งใช้ข้อยกเว้นใหม่ ("... ") จะหยุดพัก อย่างไรก็ตาม"ทีมงาน. NET ควรให้นามธรรมยกเว้นเริ่มต้นด้วยหรือไม่" - อาจจะใช่ แต่ตอนนี้มันช้าไป> 10 ปีแล้ว :)
MattDavey

คำตอบ:


11

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

แต่ ... เมื่อเข้ารหัสแอปตัวอย่างขนาดเล็กหรือหลักฐานพิสูจน์แนวคิดฉันไม่ต้องการเริ่มต้นการออกแบบคลาสย่อยยกเว้น 10 คลาสที่แตกต่างกันหรือใช้เวลาในการตัดสินใจว่าจะเป็นคลาสยกเว้นที่ "ดีที่สุด" สำหรับสถานการณ์ ฉันอยากจะโยนExceptionและส่งต่อสตริงที่อธิบายรายละเอียด เมื่อมันเป็นรหัสทิ้งฉันไม่สนใจเกี่ยวกับสิ่งเหล่านี้และถ้าฉันถูกบังคับให้สนใจสิ่งต่าง ๆ ฉันจะสร้างGenericExceptionชั้นเรียนของตัวเองแล้วโยนมันไปทุกที่หรือย้ายไปที่เครื่องมือ / ภาษาอื่น สำหรับบางโครงการฉันเห็นด้วยว่าการสร้างคลาสย่อยยกเว้นที่เกี่ยวข้องนั้นเป็นสิ่งสำคัญ แต่ไม่ใช่ทุกโครงการที่ต้องการ


ฉันเห็นด้วยกับคุณอย่างสมบูรณ์ แต่คำถามก็คือการคิดถึงโครงการที่ไม่สำคัญโดยปริยาย
marco-fiset

3

ความเป็นไปได้ A: ถูกต้องตามหลักเหตุผล

คุณถูกต้องว่า Microsoft พร้อมกับคนอื่น ๆ ไม่แนะนำให้โยนnew Exception()โดยตรงด้วยเหตุผลมากมาย

ที่ถูกกล่าวว่าเราสามารถพิจารณาอุดมคติทางวิชาการว่าจุดประสงค์ของExceptionลำดับชั้นของชั้นเรียนคือการกำหนดเอฟเฟกต์ที่แคบลงเพื่อให้สามารถยกเว้นเฉพาะข้อยกเว้นที่เฉพาะเจาะจงที่สุดเท่านั้น (เช่นArgumentNullExceptionแคบกว่าArgumentException)

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

ว่า 'นามธรรม' คำหลัก (ในความหมายทางวิชาการอย่างหมดจด) ใช้ได้เฉพาะเมื่อระดับฐานทำให้รู้สึกไม่ได้ด้วยตัวเอง - FourLeggedAnimalคือ

ทั้งหมดนี้ในใจก็จะไม่มีทางเทคนิคเหตุผลที่จะทำให้การเรียนabstract, อื่น ๆ กว่าจะเป็นแหล่งที่มาของการทำให้รุนแรงขึ้นเพื่อนักพัฒนา

ความเป็นไปได้ B: ล็อคการออกแบบ / พวกเขาไม่รู้

ถ้า MS ทำให้นามธรรมของคลาสนี้พวกเขาอาจมีปัญหาถ้าพวกเขาเปลี่ยนใจตามถนนเนื่องจากคลาสนี้มีความสำคัญอย่างยิ่งต่อพื้นฐานของภาษา พวกเขาโง่ไปแล้วApplicationExceptionดังนั้นจึงคาดการณ์ได้ว่าพวกเขาคาดหวังว่าจะมีการเปลี่ยนแปลงคำแนะนำตามถนน (ดูhttp://blogs.msdn.com/b/kcwalina/archive/2006/06/23/644822.aspx )

อาจมีเหตุผลอื่น ๆ (ฉันคิดว่าอาจจะเกี่ยวข้องกับ Reflection หรือเหตุผลทางเทคนิคอื่น ๆ ) ดังนั้นฉันจึงทำให้โพสต์นี้เป็น CW


"เพียงเพราะมันเป็น" กว้างสุด "มันไม่เป็นนามธรรม" ... แต่นั่นเป็นข้อโต้แย้งของ OP ใช่ไหม ไม่ควรเป็นนามธรรมในแง่ที่การบ่งชี้ประเภทของข้อยกเว้นบางอย่างจะต้องผ่าน
Steven Jeuris

จุดที่ดีฉันจะอัปเดตคำตอบของฉันตาม - ลักษณะของคำถามนี้จะสับสนเล็กน้อยเพราะ 'นามธรรม' เป็นทั้งคำภาษาและชื่อของแนวคิดที่กล่าวถึง
Kevin McCormick

@KevinMcCormick: คำว่า 'abstract' ที่นี่ใช้เป็นคำหลักภาษา โปรดบอกฉันว่าฉันสามารถเปลี่ยนคำถามของฉันได้อย่างไรเพื่อให้ชัดเจนสำหรับผู้อ่านในอนาคต
marco-fiset

ฉันคิดว่ามันเป็นคำถามที่ดี การแปลง OO ใด ๆ ที่เกี่ยวข้องกับabstractคำหลักจะเข้ามาถึงกำแพงนี้ ไม่แน่ใจว่าจะหลีกเลี่ยงวิธีการอื่นนอกจากการแสดงabstractคำหลักด้วย backticks
Kevin McCormick

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