【问题标题】:Scala: print a stack trace in my Scalatra appScala:在我的 Scalatra 应用程序中打印堆栈跟踪
【发布时间】:2013-09-18 18:55:14
【问题描述】:

似乎是一个相当直接的问题,但我想在触发 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

在此处打印堆栈跟踪以便我可以记录并查看它以修复我糟糕代码中的错误的最佳方法是什么?

【问题讨论】:

    标签: scala exception-handling scalatra


    【解决方案1】:

    使用来自 Apache Commons Lang 的 ExceptionUtils

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

    【讨论】:

      【解决方案2】:

      我认为你想要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)
        }
        

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-09-18
            • 2018-07-06
            • 2010-11-25
            • 1970-01-01
            • 1970-01-01
            • 2015-07-27
            • 2014-01-27
            相关资源
            最近更新 更多