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

13

看起来是一个相当简单的问题,但我想在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个回答

7
使用Apache Commons Lang中的ExceptionUtils
import org.apache.commons.lang3.exception.ExceptionUtils
(...)
logger.info("an exception occurred: " + ExceptionUtils.getStackTrace(e))

6

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


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)
}

已经有一个接受两个参数(String和Throwable)的重载方法。


2

这个问题有几种方法可以将异常堆栈转换为字符串。printStackTrace会输出到System.err,除非你提供一个writer。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接