当前位置: 首页 > 工具软件 > Scalatra > 使用案例 >

scala打印服务器消息,关于异常处理:Scala:在我的Scalatra应用程序中打印堆栈跟踪...

黄和怡
2023-12-01

似乎是一个相当直截了当的问题,但我想在触发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技术来解决。在这一点上我能做些什么来抓取stacktrace吗?我不确定请求是否与错误处理程序在同一线程上,否则可能会有一些答案。e.getStackTrace()给了我[Ljava.lang.StackTraceElement;@1f6b6954。

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

使用apache commons lang中的exceptionutils:

import org.apache.commons.lang3.exception.ExceptionUtils

(...)

logger.info("an exception occurred:" + ExceptionUtils.getStackTrace(e))

如果使用标准记录器: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个参数(字符串和可丢弃)的重载。

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

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

 类似资料: