webネタ

Webエンジニアが業務に関係することをメモしていく

scalaでコマンド叩くときのエラー

参考資料

エラー制御

エラーが2パターンある。

1、 コマンド自体実行できないと例外(IOException)が飛ぶ

scala> Process("foo").!
java.io.IOException: Cannot run program "foo": error=2, No such file or directory
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)
  at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:69)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:98)
  at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.run(ProcessBuilderImpl.scala:97)
  ... 33 elided
Caused by: java.io.IOException: error=2, No such file or directory
  at java.lang.UNIXProcess.forkAndExec(Native Method)
  at java.lang.UNIXProcess.<init>(UNIXProcess.java:135)
  at java.lang.ProcessImpl.start(ProcessImpl.java:130)
  at java.lang.ProcessBuilder.start(ProcessBuilder.java:1022)
  ... 36 more

2、 コマンド実行後の失敗は例外飛ばず、デフォルトだと標準エラー出力

scala> Process("ls /foo").!
ls: /foo: No such file or directory
res11: Int = 1

例外のほうはTryでなんかすればいいとして、

標準エラー出力をロギングしたいときは、ProcessLoggerを使う。

def plogger = ProcessLogger(identity, logger.error(_))
Process("ls /foo") ! plogger