12

似乎是一个相当直截了当的问题,但是当我在 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

4 回答 4

7

使用Apache Commons Lang 的ExceptionUtils

import org.apache.commons.lang3.exception.ExceptionUtils
(...)
logger.info("an exception occurred: " + ExceptionUtils.getStackTrace(e))
于 2014-06-27T20:20:03.987 回答
5

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

于 2013-09-18T19:06:53.133 回答
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。

于 2017-11-02T18:18:19.213 回答
2

这个问题有几种方法可以将异常堆栈跟踪转换为字符串。printStackTrace 输出到 System.err ,除非您提供编写器。

于 2013-09-18T19:09:47.487 回答