Keputusan untuk Pengecualian yang Tidak Dicentang di Scala

17

Sebagai seorang programmer java, saya selalu kritis terhadap Pengecualian Tidak Dicentang. Sebagian besar programmer menggunakannya sebagai en-route untuk kemudahan coding hanya untuk membuat masalah nanti. Juga program (meskipun tidak rapi) dengan pengecualian diperiksa jauh lebih kuat dibandingkan dengan rekan yang tidak dicentang.

Anehnya di Scala, tidak ada yang disebut Checked Exception. Semua Java diperiksa dan tidak dicentang tidak dicentang di Scala.

Apa motivasi di balik keputusan ini? Bagi saya itu membuka berbagai masalah saat menggunakan kode eksternal apa pun. Dan jika kebetulan dokumentasinya buruk, itu mengakibatkan KILL.

Jatin
sumber
11
Sebagai seorang programmer Java, saya selalu kritis terhadap pengecualian yang diperiksa. Kode yang tidak rapi tidak pernah kuat.
Michael Borgwardt

Jawaban:

28

Pengecualian yang diperiksa sebagian besar dianggap gagal. Perhatikan bahwa tidak ada bahasa yang dibuat setelah Java mengadopsinya. Lihat 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 , dll.

Secara khusus, mereka tidak dapat dikomposisikan (kecuali dengan kembali ke throws Exception).

Di Scala Anda memiliki opsi yang lebih baik: menggunakan tipe aljabar untuk nilai kembali seperti Option[T],, Either[Exception, T]tipe Anda sendiri saat Anda ingin pengguna menangani kasus tertentu (misalnya, bukannya

def foo: Int // throws FileNotFoundException, IllegalStateException

kamu punya

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

dan konsumen sekarang diminta untuk menangani semua hasil)

Untuk berurusan dengan kode eksternal yang melempar pengecualian, Anda memiliki scala.util.control.exceptionatau scala.util.Try(dimulai dengan Scala 2.10).

Alexey Romanov
sumber
4
Tidak pernah mengerti kebanyakan orang tidak menangani argumen pengecualian yang dicentang . Kebanyakan orang bukan pengembang yang baik. Saya menjamin bahwa sebagian besar pengembang tidak akan menangani hasil kesalahan. Sebenarnya, try..catchtampaknya jauh lebih mudah dibaca daripada if. Terlebih lagi saya juga dapat menjamin bahwa kebanyakan pengembang yang sama tidak akan menulis kode yang mengembalikan hasil kesalahan - terlalu rumit di Scala - Anda bahkan tidak dapat kembali dari fungsi kapan pun Anda mau (seperti di Pascal)
Pijusn
5
Saya menemukan Anda berkomentar membingungkan dan kurang bukti, @Pius. Di Scala, memilih Opsi sebagai jenis pengembalian cenderung menghasilkan pencocokan pola daripada pernyataan Jika . Mengembalikan Tidak Ada daripada Beberapa dalam gaya itu sepele, tidak rumit. Pengembang yang kurang paham mungkin tidak memilih untuk menulis fungsi yang mengembalikan tipe aljabar tetapi itu adalah hal yang berbeda. Akhirnya, ¨Anda bahkan tidak dapat kembali dari suatu fungsi kapan pun Anda inginkan - - hanya tidak benar.
itsbruce
7

Pengecualian yang diperiksa di Jawa bukanlah hal yang buruk. Tentu saja ADT mungkin merupakan pilihan yang lebih baik untuk Scala tetapi di Jawa, pengecualian yang diperiksa memiliki tempatnya sendiri dan argumen kode yang rapi tidak mengerti apa pun, tidak peduli berapa banyak blog yang mengulanginya. Pada dasarnya dikatakan bahwa Anda harus dengan senang hati mengabaikan kondisi parah dan mungkin diperbaiki yang mungkin terjadi di sistem Anda, karena sistem jenis sekrup, kode cantik membuat sistem Anda kuat secara otomatis. Alasan semacam itu juga menjelaskan mengapa begitu banyak coder Java secara sukarela memindahkan kode mereka ke dalam XML (Spring, Maven, dll. Namun, saya kehilangan bagian yang cantik di sini).

Alasan kurangnya pengecekan pengecualian dalam Scala yang diberikan oleh M. Odersky di bawah http://www.scala-lang.org/old/node/8787.html tidak berbeda dan masuk akal.

Masalah dengan pengecualian yang diperiksa paling baik ditunjukkan oleh metode peta pada daftar:

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

Bagaimana cara membuat anotasi peta dengan @throws? Jika peta tidak mendapatkan anotasi @mempering itu sendiri maka mungkin Anda tidak dapat meneruskannya ke fungsi apa pun yang memilikimemiliki @mempotong. Itu akan menghasilkan batasan dan perbedaan yang rumit untuk cara penggunaan peta. Hal-hal akan lebih baik jika kita bisa menyatakan entah bagaimana peta melempar semua pengecualian yang dilemparkan argumen fungsinya. Ada beberapa sistem efek yang dapat mengungkapkan hal ini, tetapi sejauh ini setiap notasi yang saya lihat terlalu berat.

Lukas Rytz sedang melakukan penelitian tentang sistem efek ringan yang dapat digunakan untuk mengekspresikan jenis peta dan fungsi umum lainnya secara ringkas dan tepat. Ini penelitian, jadi saat ini tidak jelas sampai sejauh mana kita akan berhasil dan berapa banyak yang bisa dimasukkan ke dalam Scala. Idealnya, kami dapat menambahkannya di beberapa titik sebagai sistem tipe opsional. Tetapi masih terlalu dini untuk membuat prediksi yang konkret.

Bersulang

Tidak yakin tapi saya pikir Java 8 lambdas juga terbatas pada pengecualian yang tidak dicentang.Metode di sebagian besar (semua?) Antarmuka fungsional baru di JDK 8 ( java.util.function.*) tidak menyatakan pengecualian tidak dicentang juga.

woky
sumber
2

Jika Anda ingin mendapatkan efisiensi, Anda harus menyerah .. presisi / kontrol <- Saya perlu kata yang lebih baik untuk itu.

Scala terletak di bagian atas sejauh abstraksi. Jika salah satu tujuan Scala adalah menghilangkan kode boilerplate yang mengganggu, maka tempat yang jelas untuk dilihat adalah penanganan pengecualian Jawa. Jika Anda ingin menulis kode cepat dalam java, teruskan pengecualian Anda yang dicentang hingga hit main()dan efektif menjadi tidak dicentang.

Saya tidak tahu apakah saya mengerti persis apa yang Anda minta tetapi ini adalah alasan paling jelas menurut saya.

Yah, saya melakukan sedikit melihat dan seseorang telah menulis tentang tragedi pengecualian cek .

David Cowden
sumber