Decisione per le eccezioni non selezionate in Scala


17

Come programmatore Java, sono sempre stato critico nei confronti delle Eccezioni non selezionate. Principalmente i programmatori lo usano come via per la semplicità di codifica solo per creare problemi in seguito. Anche i programmi (sebbene disordinati) con eccezioni verificate sono molto robusti rispetto alle controparti non controllate.

Sorprendentemente alla Scala, non c'è niente chiamato Checked Exceptions. Tutte le Java selezionate e deselezionate sono deselezionate in Scala.

Qual è la motivazione dietro questa decisione? Per me apre una vasta gamma di problemi quando si utilizza qualsiasi codice esterno. E se per caso la documentazione è scarsa, si ottiene KILL.


11
Come programmatore Java, ho sempre criticato le eccezioni verificate. Il codice disordinato non è mai robusto.
Michael Borgwardt,

Risposte:


28

Le eccezioni controllate sono per lo più considerate un errore. Si noti che nessuna lingua creata dopo l'adozione da parte di Java. Vedi 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 , ecc.

In particolare, sono incomposibili (tranne ripristinando a throws Exception).

In Scala si dispone di una soluzione migliore: usando tipi algebrici per i valori di ritorno, come Option[T], Either[Exception, T], il proprio tipo quando si desidera che l'utente casi specifici manico (ad esempio, invece di

def foo: Int // throws FileNotFoundException, IllegalStateException

hai

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

e al consumatore è ora richiesto di gestire tutti i risultati)

Per gestire il codice esterno che genera eccezioni, hai scala.util.control.exceptiono scala.util.Try(a partire da Scala 2.10).


4
Non ho mai capito che la maggior parte delle persone non gestisce l'argomento delle eccezioni verificate . Molte persone non sono bravi sviluppatori. Garantisco che la maggior parte degli sviluppatori non gestirà comunque il risultato dell'errore. In realtà, try..catchsembra molto più leggibile di if. Inoltre, posso anche garantire che quegli stessi sviluppatori non scriveranno codice che restituisca risultati di errore - troppo complicati in Scala - non puoi nemmeno tornare da una funzione quando vuoi (proprio come in Pascal)
Pijusn,

5
Trovo il tuo commento confuso e privo di prove, @Pius. In Scala, la scelta di Opzione come tipo restituito può comportare la corrispondenza del modello anziché le istruzioni If . Restituire None piuttosto che Some in quello stile è banale, non complesso. Gli sviluppatori meno esperti potrebbero non scegliere di scrivere funzioni che restituiscono tipi algebrici, ma questa è una cosa diversa. Infine, "non puoi nemmeno tornare da una funzione quando vuoi", semplicemente falso.
itsbruce

7

Le eccezioni verificate in Java non sono poi così male. Naturalmente gli ADT possono essere l'opzione migliore per Scala ma in Java, le eccezioni verificate hanno il loro posto e l' argomento del codice ordinato è semplicemente privo di senso, non importa quanti blog lo abbiano ripetuto. In pratica dice che dovresti tranquillamente ignorare le condizioni gravi e possibilmente riparabili che possono accadere nel tuo sistema, perché un sistema a vite, un bel codice rende il tuo sistema robusto automagicamente. Tale ragionamento spiega anche perché così tanti programmatori Java spostano volontariamente il loro codice in XML (Spring, Maven, ecc. Mi manca la bella parte qui).

Il motivo della mancanza di eccezioni verificate in Scala fornite da M. Odersky sotto http://www.scala-lang.org/old/node/8787.html è sorprendentemente diverso e ha senso.

Il problema con le eccezioni verificate è dimostrato meglio dal metodo della mappa negli elenchi:

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

Come annotare la mappa con @throws? Se la mappa non ottiene un'annotazione @throws stessa, presumibilmente non è possibile passargli alcuna funzione che ha un @throws. Ciò introdurrebbe ingombranti restrizioni e distinzioni per i modi in cui è possibile utilizzare la mappa. Le cose sarebbero migliori se potessimo affermare in qualche modo che la mappa genera tutte le eccezioni che genera l'argomento della sua funzione. Ci sono alcuni sistemi di effetti che possono esprimerlo, ma finora ogni notazione che ho visto è troppo pesante.

Lukas Rytz sta facendo delle ricerche sui sistemi di effetti leggeri che potrebbero essere utilizzati per esprimere il tipo di mappa e altre funzioni comuni in modo conciso e preciso. È ricerca, quindi al momento non è chiaro in che misura riusciremo e quanto di tutto ciò potrà essere messo in Scala. Idealmente, saremo in grado di aggiungerlo ad un certo punto come un sistema di tipo opzionale. Ma è troppo presto per fare previsioni concrete.

Saluti

Non sono sicuro, ma penso che anche i lambda Java 8 siano limitati a eccezioni non controllate.I metodi nella maggior parte (tutte?) Delle nuove interfacce funzionali in JDK 8 ( java.util.function.*) non dichiarano nemmeno eccezioni non controllate.


2

Se vuoi guadagnare efficienza, devi rinunciare .. precisione / controllo <- Ho bisogno di una parola migliore per questo.

Scala si trova verso l'alto per quanto riguarda l'astrazione. Se uno degli obiettivi di Scala è sbarazzarsi del fastidioso codice boilerplate, un posto ovvio da guardare è la gestione delle eccezioni di Java. Se vuoi scrivere codice veloce in java, continua a sollevare le eccezioni verificate fino a quando non colpiscono main()e diventano effettivamente deselezionate.

Non so se sto ottenendo esattamente quello che mi stai chiedendo, ma questa è la ragione più ovvia secondo me.

Beh, ho guardato un po 'e qualcuno ha scritto della tragedia delle eccezioni al controllo .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.