Scala:在我的Scalatra应用程序中打印堆栈跟踪

时间:2013-09-18 18:55:14

标签: scala exception-handling scalatra

看起来像是一个相当直接的问题,但是当我触发Scalatra中的顶级错误处理程序时,我想记录堆栈跟踪。我故意在我的一个方法中抛出异常,做一些简单的事情:

throw new IllegalArgumentException

在错误处理程序中,代码如下所示:

 error {
  case e => {
    val logger = LoggerFactory.getLogger(getClass)
    logger.info("an exception occurred: " + e.getStackTrace())
    logger.info("the request body is: " + request)
    NotFound("An error occurred, please contact support")
  }
}

错误处理程序本身是特定于Scalatra的,但我很确定我正在寻找的答案可以使用任何香草Scala技术来解决。在这一点上我能做些什么来抓住堆栈跟踪?我不确定请求是否与错误处理程序在同一个线程上,否则可能会有一些答案。 e.getStackTrace()给了我[Ljava.lang.StackTraceElement;@1f6b6954

这里打印堆栈跟踪的最佳方法是什么,以便我可以记录并查看它以修复我可怕代码中的错误?

4 个答案:

答案 0 :(得分:5)

使用Apache Commons Lang的ExceptionUtils

import org.apache.commons.lang3.exception.ExceptionUtils
(...)
logger.info("an exception occurred: " + ExceptionUtils.getStackTrace(e))

答案 1 :(得分:3)

如果使用标准记录器:com.typesafe.scalalogging.Logger,记录器会为您打印堆栈跟踪。

你可以这样使用它:

import com.typesafe.scalalogging.Logger
import org.slf4j.LoggerFactory

try {     
    throw new Exception("test message")
} catch {
    case e:Exception => logger.error("Exception " , e)
}

已经有一个重载接受2个参数,String和Throwable。

答案 2 :(得分:2)

我认为你想要printStackTrace()而不是getStackTrace。如果要输出到日志文件,getMessage()可能会有所帮助。或者您可以尝试将整个异常对象传递给记录器。

答案 3 :(得分:2)

This question有几种方法可以将异常堆栈跟踪转换为String。除非您提供编写器,否则printStackTrace会输出到System.err。