如何在Scala中捕获异常stacktrace(stderr)到文件

时间:2018-12-20 23:04:24

标签: scala jvm

如何在Scala中将异常堆栈跟踪捕获到文件中?我尝试使用System.setErr,但没有用,虽然Console.withErr只能为代码段设置,而不能为整个应用程序设置。任何想法? 我想将应用程序所有未捕获的异常记录到文件中

编辑:

更多上下文:我在带有类路径中添加的jar的spark-shell中运行。我要做的是实例化一个类的对象,并且在类中运行的第一个代码如下,这并没有给我
预期印刷品

Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
def uncaughtException(t: Thread, e: Throwable): Unit = {
  logger.error("exception logged")
  println("exception logged")
}
})

throw new Exception("my ex")

但是我在stdout和日志文件中都看不到打印内容

1 个答案:

答案 0 :(得分:0)

只需使用Thread.setUncaughtExceptionHandler:

Java uncaught global exception handler

如果您的应用是单线程的,请使用Thread.currentThread()获取当前线程。

修改

object ErrorHandling {
  def main(args: Array[String]): Unit = {
    Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      def uncaughtException(t: Thread, e: Throwable): Unit = {
//        logger.error("exception logged")
        println(s"exception logged: $e")
        e.printStackTrace()
      }
    })
    throw new Exception(s"boom")
  }
}

应该给您类似的东西

exception logged: java.lang.Exception: boom
java.lang.Exception: boom
    at ErrorHandling$.main(ErrorHandling.scala:10)
    at ErrorHandling.main(ErrorHandling.scala)