关于异常处理:Scala:在我的Scalatra应用程序中打印堆栈跟踪

Scala: print a stack trace in my Scalatra app

似乎是一个相当直截了当的问题,但我想在触发scalatra中的顶级错误处理程序时记录一个堆栈跟踪。我故意在我的一个方法中抛出一个异常,通过做一些琐碎的事情:

1
throw new IllegalArgumentException

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

1
2
3
4
5
6
7
8
 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技术来解决。在这一点上我能做些什么来抓取stacktrace吗?我不确定请求是否与错误处理程序在同一线程上,否则可能会有一些答案。e.getStackTrace()给了我[Ljava.lang.StackTraceElement;@1f6b6954

在这里打印一个堆栈跟踪的最好方法是什么,这样我就可以记录并查看它来修复我的糟糕代码中的错误?


使用apache commons lang中的exceptionutils:

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

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

您可以这样使用它:

1
2
3
4
5
6
7
8
import com.typesafe.scalalogging.Logger
import org.slf4j.LoggerFactory

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

已存在接受2个参数(字符串和可丢弃)的重载。


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


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