捕获Scala流程失败

时间:2018-04-07 09:59:28

标签: scala exception-handling

我有一个基于scala构建的RESTful API。其中一个路由调用外部命令并使用ProcessLogger捕获输出。当我在服务器上放置少量负载时(通过单元测试),外部命令调用开始间歇性地失败。没有响应返回,HTTP请求超时。没有填充Process调用的返回代码,没有抛出异常......我无法在日志中捕获或查找任何内容。 是否有一种特定的方法来捕获scala中的Process调用的所有问题,这可能有助于我调试最新情况?

我的代码看起来像这样......

try { 
  var resultCode:Int = 
    (Seq("echo",data) #| 
      Seq("external-command-to-call")) !
      ProcessLogger(stdout append _, stderr append _)

  println("Output "+resultCode)
  println(stderr)
  println(stdout)

  // check return code
  if(resultCode > 0) {
    Left("An error occurred")
  }
} catch {
   case e: Exception => {
     Left("An exception occurred")
   }
}

10次中的9次将打印“输出”,但间歇性地它将在外部呼叫中死亡,从不打印“输出”。两个“左”都没有被触发。 我尝试使用Try / Success / Failure并捕捉“Throwable”但没有快乐。

2 个答案:

答案 0 :(得分:2)

这只是我的一个想法。 我们不能使用Scala Futures来解决这个问题:) 我希望你可以使用Future onFailure来处理这种情况。 我在StackOverflow中找到了关于Scala Process Logger的类似文章,希望这对您有所帮助。 Scala ProcessLogger & Future: How can I make sure all line callbacks are called BEFORE the onComplete block?

Scala Future [T]

当一个Future用一个值完成时,它是一个成功的完成。 如果Future以异常完成,则失败。 https://docs.scala-lang.org/overviews/core/futures.html

`val f: Future[List[String]] = Future {
  session.getRecentPosts
}

f onFailure {
  case t => println("An error has occured: " + t.getMessage)
}

f onSuccess {
  case posts => for (post <- posts) println(post)
} `

答案 1 :(得分:0)

所以问题可以使用Scala的Future monad来解决你需要做的是改变那些processLogger方法返回Future [Int]现在你不应该使用Future的onSuccess和onFailure方法,因为它们已经被弃用了所以你可以通过在此Future上添加回调来确保它。 使用onCompletemapforeach

result.onComplete{
case Success(x) => println(x)

case Failure(ex)=>ex.printStackTrace}