มีข้อยกเว้นในการจัดการกับปัญหาการตัดขวางหรือไม่?


13

ฉันไม่เห็นความแตกต่างระหว่างข้อกังวลของการจัดการข้อยกเว้นและการเข้าสู่ระบบที่ทั้งคู่เป็นข้อกังวลตัดขวาง คุณคิดอย่างไร? ไม่ควรจัดการแยกต่างหากด้วยตัวเองแทนที่จะสอดแทรกด้วยตรรกะหลักที่วิธีการใช้งานอยู่?

แก้ไข : สิ่งที่ฉันพยายามจะพูดก็คือในความคิดของฉันการใช้วิธีการควรมีตรรกะสำหรับเส้นทางที่ประสบความสำเร็จของการดำเนินการและข้อยกเว้นควรได้รับการจัดการที่อื่น นี่ไม่ใช่ข้อยกเว้นเกี่ยวกับการตรวจสอบ / ไม่ได้ตรวจสอบ

ตัวอย่างเช่นภาษาอาจจัดการกับข้อยกเว้นในวิธีการตรวจสอบอย่างสมบูรณ์โดยใช้โครงสร้างดังนี้:

class FileReader {

  public String readFile(String path) {
    // implement the reading logic, avoid exception handling
  }

}

handler FileReader {

   handle String readFile(String path) {
      when (IOException joe) {
        // somehow access the FileInputStram and close it
      }
   }

}

ในภาษาแนวคิดข้างต้นโปรแกรมจะไม่รวบรวมในกรณีที่ไม่มีการFileReader จัดการเพราะFileReader ระดับ 's readfile ไม่ได้โยนข้อยกเว้น ดังนั้นโดยการประกาศFileReader ตัวจัดการคอมไพเลอร์สามารถมั่นใจได้ว่ามันจะถูกจัดการและจากนั้นโปรแกรมรวบรวม

วิธีนี้เรามีปัญหาข้อยกเว้นทั้งที่ตรวจสอบและไม่ได้ตรวจสอบอย่างดีที่สุด: ความทนทานและความสามารถในการอ่าน

คำตอบ:


14

ในบางกรณีใช่

ในกรณีที่คุณมีข้อยกเว้นที่คุณต้องการบันทึก (ซึ่งฉันคิดว่าเป็นเกือบทุกครั้ง) จากนั้นใช่ข้อยกเว้นนั้นเกี่ยวข้องกับข้อกังวลตัดขวาง

เวลาส่วนใหญ่ไม่มี

อย่างไรก็ตามใช้อินสแตนซ์ของ SocketListener หาก socketlistener ส่งข้อยกเว้นเนื่องจากปลายอีกด้านหนึ่งปล่อยการเชื่อมต่อดังนั้นสิ่งนี้ควรเป็นพฤติกรรมที่คาดการณ์ไว้และดังนั้นแอปพลิเคชันควรดำเนินการตามสถานการณ์ที่ทำให้เกิดข้อยกเว้น นี่ไม่ใช่สิ่งที่ Aspect ทั่วไปควรจัดการและดังนั้นจึงไม่ควรกังวลข้าม

การระบุข้อกังวลตัดขวาง

หากคุณทำซ้ำรหัสเดียวกันซ้ำแล้วซ้ำอีกจะต้องมีการสรุป หากสิ่งที่เป็นนามธรรมส่งเสริมตัวเองไปยังหลายชั้นก็อาจเป็นกังวลตัดข้าม เท่านั้นก็ควรได้รับการพิจารณา


4

การบันทึกเป็นตัวเลือก การจัดการข้อยกเว้นไม่ใช่

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

อย่างน้อยในการใช้งานที่ จำกัด ของฉันของทั้งสองนั่นหมายความว่าเป้าหมายทั้งสองนั้นได้รับการจัดการที่ดีที่สุดในวิธีที่ต่างกันและไม่อยู่ภายใต้การออกแบบเดียวกัน


1

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


0

ฉันคิดว่าสิ่งนี้เชื่อมโยงกับประเด็นเรื่องนามธรรมรั่วไหล

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

อย่างไรก็ตาม "หลักการของ abstractions รั่ว" เป็นปัญหา ข้อยกเว้นบางอย่างไม่สามารถแปลเป็นรูปแบบที่เหมาะสมในชั้นถัดไปของสิ่งที่เป็นนามธรรม

ข้อยกเว้นที่เกี่ยวข้องกับระบบไฟล์บนเครือข่ายเป็นตัวอย่างง่ายๆ ความล้มเหลวของเครือข่ายไม่สามารถแสดงในแง่ที่สมเหตุสมผลกับ "นามธรรม" หรือถ้าเป็นเช่นนั้นสิ่งที่เป็นนามธรรมนั้นไม่ได้แยกออกจากรายละเอียดทั้งหมดที่เกี่ยวข้องกับการใช้งานการจัดการไฟล์

ความล้มเหลวของเครือข่ายจะรั่วไหลออกจากสิ่งที่เป็นนามธรรมพื้นฐานและดังนั้นจึงต้องเป็นกังวลข้ามตัดภายในส่วนที่เหลือของรหัส

สิ่งนี้ไม่ได้เป็นข้อยกเว้นที่เฉพาะเจาะจง รหัสข้อผิดพลาดที่ส่งคืนค่าทั้งหมดสำหรับไฟล์ API ที่ไม่เกี่ยวข้องกับนามธรรมของไฟล์ แต่ให้แทนรายละเอียดฮาร์ดดิสก์หรือเครือข่ายหรือความล้มเหลวใด ๆ ที่เป็นสิ่งเดียวกันในรูปแบบที่แตกต่างกันแสดงว่าฮาร์ดดิสก์ล้มเหลวและเครือข่ายล้มเหลว ฯลฯ มีความกังวลข้ามการตัดโดยไม่คำนึงถึงวิธีรายงานความล้มเหลวเหล่านั้น

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