2011-03-08 12 views
5

Cuando un usuario no proporciona argumentos de línea de comando, quiero que Hello World imprima información de uso en lugar de un rastro de error.Formas de evitar la excepción en el hilo "principal" clojure.lang.ArityException?

":";exec clj -m `basename $0 .clj` ${1+"[email protected]"} 
":";exit 

(ns hello 
    (:gen-class)) 

(defn -main 
    [greetee] 
    (println (str "Hello " greetee "!"))) 

$ ./hello.clj Fred 
Hello Fred! 
$ ./hello.clj 
Exception in thread "main" clojure.lang.ArityException: Wrong number of args (0) passed to: hello$-main 
    at clojure.lang.AFn.throwArity(AFn.java:439) 
    at clojure.lang.AFn.invoke(AFn.java:35) 
    at clojure.lang.Var.invoke(Var.java:397) 
    at clojure.lang.AFn.applyToHelper(AFn.java:159) 
    at clojure.lang.Var.applyTo(Var.java:518) 
    at clojure.core$apply.invoke(core.clj:600) 
    at clojure.main$main_opt.invoke(main.clj:323) 
    at clojure.lang.FnLoaderThunk.invoke(FnLoaderThunk.java:36) 
    at clojure.main$main.doInvoke(main.clj:426) 
    at clojure.lang.RestFn.invoke(RestFn.java:422) 
    at clojure.lang.FnLoaderThunk.invoke(FnLoaderThunk.java:36) 
    at clojure.lang.Var.invoke(Var.java:405) 
    at clojure.lang.AFn.applyToHelper(AFn.java:165) 
    at clojure.lang.Var.applyTo(Var.java:518) 
    at clojure.main.main(main.java:37) 

Respuesta

6
(defn -main [& args] 
    (if-not (first args) 
    (usage) 
    (println "Hello" (first args)))) 

Puede mejorar en esto un poco justo, pero eso es un esquema razonable.

+0

Gracias hombre! Estás demostrando ser un recurso valioso en Clojure. – mcandre

+1

Es posible que también desee consultar https://github.com/amalloy/clojopts, mi biblioteca de análisis de opciones. Todavía no contiene mensajes de uso, pero está en la lista de deseos y puede contribuir si lo desea. – amalloy

Cuestiones relacionadas