Scala'da Kontrol Edilmemiş İstisnalar Kararı


17

Bir java programcısı olarak, her zaman Denetlenmeyen İstisnalar'ı eleştirdim. Çoğunlukla programcılar bunu daha sonra sorun yaratmak için kolay kodlama yolu olarak kullanırlar. Ayrıca, kontrol edilmiş istisnaları olan (düzensiz olsa da) programlar, kontrol edilmemiş muadillerine kıyasla çok sağlamdır.

Şaşırtıcı bir şekilde Scala'da, Kontrol Edilen İstisnalar diye bir şey yoktur. Kontrol edilen ve işaretlenmeyen tüm Java'lar Scala'da işaretlenmez.

Bu kararın ardındaki motivasyon nedir? Benim için herhangi bir harici kod kullanırken çok çeşitli sorunlar açar. Ve eğer tesadüfen belgelerin zayıf olması KILL ile sonuçlanır.


11
Bir Java programcısı olarak, kontrol edilen istisnaları her zaman eleştirdim. Düzensiz kod asla sağlam değildir.
Michael Borgwardt

Yanıtlar:


28

İşaretli istisnalar çoğunlukla başarısız olarak kabul edilir. Java'nın bunları benimsemesinden sonra oluşturulan hiçbir dil olmadığını unutmayın. Bkz. 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 vb.

Özellikle, birleştirilemezler (geri dönme hariç throws Exception).

Scala size daha iyi bir seçenek vardır: örneğin dönüş değerleri için cebirsel türlerini kullanarak Option[T], Either[Exception, T]kendi türü Eğer örneğin yerine (sap özel durumlarda kullanıcıyı istediğinizde

def foo: Int // throws FileNotFoundException, IllegalStateException

var

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

ve tüketicinin artık tüm sonuçları işlemesi gerekmektedir)

İstisnalar atan harici kodlarla uğraşmak için, scala.util.control.exceptionveya scala.util.Try(Scala 2.10 ile başlayarak) vardır.


4
Hiç anlamadım çoğu insan exceptions` argüman kontrol tanıtıcı yok . Çoğu insan iyi geliştirici değildir. Çoğu geliştiricinin yine de hata sonucunu işlemeyeceğini garanti ediyorum. Aslında, try..catchdaha okunabilir görünüyor if. Dahası, aynı çoğu geliştiricinin Scala'da çok karmaşık olan hata sonucunu döndüren kod yazamayacağını da garanti edebilirim - istediğiniz zaman (tıpkı Pascal'da olduğu gibi) bir
işlevden geri dönemezsiniz

5
Kafa karıştırıcı ve kanıtta eksik yorum buluyorum, @Pius. Scala'da, dönüş türü olarak Option'ı seçmek büyük olasılıkla If ifadeleri yerine kalıp eşleşmesi ile sonuçlanır . Bu tarzda Bazıları yerine Hiçbiri döndürmek önemsizdir, karmaşık değildir. Daha az ipucu veren geliştiriciler, cebirsel türleri döndüren işlevleri yazmayı seçmeyebilirler, ancak bu farklı bir şeydir. Son olarak, 'istediğiniz zaman bir işlevden bile geri dönemezsiniz' - sadece doğru değil.
itsbruce

7

Java'da kontrol edilen istisnalar o kadar da kötü bir şey değil. Tabii ki ADT'ler Scala için daha iyi bir seçenek olabilir, ancak Java'da, kontrol edilen istisnaların yeri vardır ve derli toplu kod argümanı, kaç blogun tekrarladığı önemli değil, anlamsızdır. Temel olarak, sisteminizde meydana gelebilecek ciddi ve muhtemelen onarılabilir durumları mutlu bir şekilde göz ardı etmeniz gerektiğini söyler, çünkü vidalı sistem, güzel kod sisteminizi otomatik olarak sağlam kılar. Böyle bir akıl yürütme ayrıca neden bu kadar çok Java kodlayıcısının gönüllü olarak kodlarını XML'lere taşıdığını açıklar (Spring, Maven, vs. Burada güzel kısmı kaçırıyorum ).

Http://www.scala-lang.org/old/node/8787.html adresinden M. Odersky tarafından verilen Scala'da kontrol edilen istisnaların olmamasının nedeni şaşırtıcı derecede farklı ve mantıklı.

İşaretli istisnalarla ilgili sorun en iyi şekilde listelerdeki harita yöntemi ile gösterilir:

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

@Throws ile haritaya nasıl açıklama eklenir? Harita bir @ harfleri ek açıklaması almazsa, muhtemelen @ harfleri olan herhangi bir işlevi geçiremezsiniz. Bu, haritanın kullanılabilme yolları için hantal kısıtlamalar ve farklılıklar getirecektir. Bir şekilde haritanın işlev argümanının attığı tüm istisnaları attığını söyleseydik daha iyi olurdu. Bunu ifade edebilecek bazı efekt sistemleri var, ancak şimdiye kadar gördüğüm her gösterim çok ağır.

Lukas Rytz, haritanın türünü ve diğer ortak işlevleri özlü ve kesin bir şekilde ifade etmek için kullanılabilecek hafif efekt sistemleri hakkında biraz araştırma yapıyor. Araştırma, bu yüzden şu anda ne kadar başarılı olacağımız ve bunun ne kadarının Scala'ya koyulabileceği belirsiz. İdeal olarak, isteğe bağlı bir tür sistemi olarak bir noktada ekleyebileceğiz. Ancak somut tahminler yapmak için henüz çok erken.

Şerefe

Emin değilim ama Java 8 lambdas'ın da denetlenmeyen istisnalarla sınırlı olduğunu düşünüyorum.JDK 8 ( java.util.function.*) ' deki çoğu yeni (yeni?) İşlevsel arabirimdeki yöntemler de denetlenmeyen özel durumlar bildirmez.


2

Verimlilik elde etmek istiyorsanız, vazgeçmelisiniz .. hassasiyet / kontrol <- Bunun için daha iyi bir kelimeye ihtiyacım var.

Scala soyutlamaya kadar zirveye yerleşti. Scala'nın hedeflerinden biri can sıkıcı demirbaş kodundan kurtulmaksa, o zaman bakılması gereken açık bir yer Java'nın istisna işlemesi. Java'da hızlı kod yazmak istiyorsanız, kontrol edilen istisnalarınızı vurup main()etkin bir şekilde kontrol edilinceye kadar atmaya devam edin .

Tam olarak ne istediğini anlayamıyorum bilmiyorum ama bence bu en açık neden.

Biraz baktım ve birisi çek istisnalarının trajedisi hakkında yazdı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.