scrivo una serie di semplici script Scala che finiscono a partire da un semplice fiammifero modello su args
come:Pattern Match args e dare messaggi di errore in uno script leggero Scala
val Array(path, foo, whatever) = args
// .. rest of the script uses "path", "foo", etc.
Naturalmente, se fornisco il numero errato di argomenti, ricevo un errore imperscrutabile come:
scala.MatchError: [Ljava.lang.String;@7786df0f
at Main$$anon$1.<init>(FollowUsers.scala:5)
...
C'è un modo semplice per dare un messaggio di errore più utile? La mia soluzione attuale è quella di fare qualcosa di simile:
args match {
case Array(path, foo, whatever) => someFunction(path, foo, whatever)
case _ => System.err.println("usage: path foo whatever")
}
def someFunction(path: String, foo: String, whatever: String) = {
// .. rest of the script uses "path", "foo", etc.
}
Ma che si sente come un sacco di boilerplate quello che con dover definire tutta una altra funzione, e di dover ripetere "percorso", "pippo" e "qualunque" in così tanti posti. C'è un modo migliore? Immagino che potrei perdere la funzione e mettere il corpo nella dichiarazione della partita, ma mi sembra meno leggibile.
So che potrei usare uno dei tanti argomenti della riga di comando che analizzano i pacchetti, ma sto davvero cercando qualcosa di estremamente leggero che non debba aggiungere una dipendenza e modificare il mio classpath per.
Sì, immagino sia ok, anche se otterrai una traccia di stack invece di un semplice messaggio di errore. – Steve
Questo è ciò per cui 'require' è destinato. Per esempio. 'require (args.length == 3," args deve avere la lunghezza tre in chiamata a XYZ ")' –
La versione con "require" è carina e semplice. Si ottiene comunque un'eccezione molto prolissa: 'java.lang.IllegalArgumentException: requisito non riuscito: usage: path foo whatever' (e quindi tutto il solito traceback). Ha perfettamente senso per uno sviluppatore Scala, ma potrebbe essere un po 'di confusione per qualcuno che non conosce Scala ma vuole solo usare il mio script. – Steve