การตัดสินใจสำหรับข้อยกเว้นที่ไม่ได้ตรวจสอบใน Scala


17

ในฐานะโปรแกรมเมอร์ Java ฉันมีความสำคัญอย่างยิ่งต่อข้อยกเว้นที่ไม่ได้ตรวจสอบ โปรแกรมเมอร์ส่วนใหญ่ใช้เป็นเส้นทางในการเข้ารหัสความง่ายเท่านั้นเพื่อสร้างปัญหาในภายหลัง นอกจากนี้โปรแกรม (แม้ว่าจะไม่เป็นระเบียบ) ที่มีข้อยกเว้นที่ตรวจสอบนั้นมีความแข็งแกร่งมากเมื่อเปรียบเทียบกับโปรแกรมที่ไม่ได้ตรวจสอบ

น่าแปลกที่ Scala ไม่มีสิ่งใดที่เรียกว่าข้อยกเว้นที่ตรวจสอบแล้ว Java ที่เลือกและไม่ถูกตรวจสอบทั้งหมดจะถูกตรวจสอบใน Scala

แรงจูงใจในการตัดสินใจครั้งนี้คืออะไร? สำหรับฉันมันเปิดปัญหามากมายเมื่อใช้รหัสภายนอกใด ๆ และถ้าโดยบังเอิญเอกสารไม่ดีก็จะส่งผลให้ฆ่า


11
ในฐานะโปรแกรมเมอร์ Java ฉันมีความสำคัญอย่างยิ่งต่อการตรวจสอบข้อยกเว้น รหัสที่ไม่เป็นระเบียบไม่เคยมีประสิทธิภาพ
Michael Borgwardt

คำตอบ:


28

การตรวจสอบข้อยกเว้นส่วนใหญ่จะถือว่าเป็นความล้มเหลว โปรดทราบว่าไม่มีภาษาใดที่สร้างขึ้นหลังจากมีการใช้ภาษาจาวา ดูhttp://www.artima.com/intv/handcuffs2.html , http://googletesting.blogspot.ru/2009/09/checked-exceptions-i-love-you-but-you.html , http: / / /www.mindview.net/Etc/Discussions/CheckedExceptionsเป็นต้น

โดยเฉพาะอย่างยิ่งพวกเขาจะ uncomposable (ยกเว้นโดยย้อนไปthrows Exception)

ใน Scala คุณมีตัวเลือกที่ดี: ใช้ประเภทพีชคณิตสำหรับค่าที่ส่งคืนเช่นOption[T], Either[Exception, T]ชนิดของคุณเองเมื่อคุณต้องการให้ผู้ใช้เฉพาะกรณีการจัดการ (เช่นแทน

def foo: Int // throws FileNotFoundException, IllegalStateException

คุณมี

sealed trait FooResult
case class Success(value: Int) extends FooResult
case class FileNotFound(file: File) extends FooResult
case object IllegalState extends FooResult

def foo: FooResult

และผู้บริโภคจำเป็นต้องจัดการผลลัพธ์ทั้งหมด)

สำหรับการรับมือกับรหัสภายนอกซึ่งไม่ข้อยกเว้นโยนคุณมีscala.util.control.exceptionหรือscala.util.Try(เริ่มต้นด้วย Scala 2.10)


4
ไม่เข้าใจว่าคนส่วนใหญ่ไม่จัดการกับข้อโต้แย้งที่ตรวจสอบแล้ว คนส่วนใหญ่ไม่ใช่นักพัฒนาที่ดี ฉันรับประกันได้ว่านักพัฒนาส่วนใหญ่จะไม่จัดการกับข้อผิดพลาดอยู่ดี ที่จริงแล้วดูเหมือนว่าอ่านได้มากขึ้นกว่าtry..catch ifมีอะไรมากกว่าที่ฉันยังสามารถรับประกันได้ว่าผู้ที่เดียวกันนักพัฒนาส่วนใหญ่จะไม่ได้ไปเขียนโค้ดที่ผลตอบแทนที่ผิดพลาด - ซับซ้อนเกินไปใน Scala - คุณสามารถไม่ได้กลับมาจากการทำงานเมื่อใดก็ตามที่คุณต้องการ (เช่นเดียวกับในปาสคาล)
Pijusn

5
ฉันคิดว่าคุณแสดงความคิดเห็นที่ทำให้สับสนและขาดหลักฐาน @Pius ใน Scala การเลือกตัวเลือกเป็นประเภทส่งคืนมีแนวโน้มที่จะส่งผลให้เกิดการจับคู่รูปแบบแทนที่จะเป็นคำสั่งIf การส่งคืนไม่มีมากกว่าบางชนิดในลักษณะนั้นไม่สำคัญไม่ซับซ้อน ผู้พัฒนาที่มีเล่ห์เหลี่ยมน้อยลงอาจไม่เลือกที่จะเขียนฟังก์ชั่นซึ่งคืนค่าประเภทพีชคณิต แต่นั่นเป็นสิ่งที่แตกต่างออกไป ในที่สุด "คุณไม่สามารถแม้แต่จะกลับจากฟังก์ชั่นเมื่อใดก็ตามที่คุณต้องการ" - ไม่จริง
itsbruce

7

ตรวจสอบข้อยกเว้นใน Javaไม่ใช่สิ่งที่เลวร้าย แน่นอนว่า ADT อาจเป็นตัวเลือกที่ดีกว่าสำหรับ Scala แต่ใน Java มีข้อยกเว้นที่ตรวจสอบแล้วและอาร์กิวเมนต์ของโค้ดที่เป็นระเบียบนั้นเป็นเพียงเรื่องไร้เหตุผลไม่ว่าจะมีกี่บล็อกซ้ำก็ตาม พื้นมันบอกว่าคุณมีความสุขควรละเลยเงื่อนไขที่รุนแรงและอาจปรับปรุงที่อาจเกิดขึ้นในระบบของคุณเนื่องจากระบบประเภทสกรูสวยรหัสทำให้ระบบอัตโนมัติที่แข็งแกร่งของคุณ เหตุผลดังกล่าวยังอธิบายว่าทำไมตัวแปลงสัญญาณ Java จำนวนมากจึงย้ายโค้ดของตนไปยัง XML อย่างสมัครใจ (Spring, Maven และอื่น ๆ ฉันคิดถึงส่วนที่ค่อนข้างดีที่นี่)

เหตุผลที่ไม่มีข้อยกเว้นที่ตรวจสอบแล้วใน Scala กำหนดโดย M. Odersky ด้านล่างhttp://www.scala-lang.org/old/node/8787.htmlนั้นแตกต่างกันอย่างน่าประหลาดใจและสมเหตุสมผล

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

def map[B](f: A => B): List[B]

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

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

ไชโย

ไม่แน่ใจ แต่ฉันคิดว่า lambdas Java 8 นั้นถูก จำกัด ด้วยข้อยกเว้นที่ไม่ได้ตรวจสอบวิธีการในอินเทอร์เฟซการทำงานใหม่ส่วนใหญ่ (ทั้งหมด?) ใน JDK 8 ( java.util.function.*) ไม่ได้ประกาศข้อยกเว้นที่ไม่ได้ตรวจสอบ


2

ถ้าคุณต้องการเพิ่มประสิทธิภาพคุณต้องยอมแพ้ .. ความแม่นยำ / การควบคุม <- ฉันต้องการคำศัพท์ที่ดีกว่า

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

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

ดีฉันได้เล็ก ๆ น้อย ๆ และกำลังมองหาใครบางคนได้เขียนเกี่ยวกับโศกนาฏกรรมของข้อยกเว้นการตรวจสอบ

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