2013-09-18 5 views
8

Похоже, что проблема довольно прямолинейная, но я бы хотел записать трассировку стека, когда запускается обработчик ошибок верхнего уровня в Scalatra. Я намеренно бросаю исключение в одном из моих методов, делая что-то, как тривиальное, как:Scala: распечатать трассировку стека в моем приложении 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") 
    } 
} 

обработчик ошибок сам по себе является Скалатра специфична, но я уверен, что ответ, который я ищу, можно решить, используя любой ванильный метод Scala. Есть ли что-то, что я могу сделать в этот момент, чтобы захватить стек? Я не уверен, что запрос находится в том же потоке, что и обработчик ошибок, иначе может быть какой-то ответ. e.getStackTrace() дает мне [Ljava.lang.StackTraceElement;@1f6b6954

Какой лучший способ получить трассировку стека здесь распечатан, чтобы я мог регистрировать и просматривать его, чтобы исправить ошибки в моем ужасном коде?

ответ

2

Я думаю, что вы хотите printStackTrace(), а не getStackTrace. Если вы выводите файл журнала, getMessage() может оказаться полезным. Или вы можете попробовать передать весь объект исключения в регистратор.

2

This question имеет несколько способов преобразования трассы стека исключений в строку. printStackTrace выводит на System.err, если вы не предоставите автора.

4

ExceptionUtils Использование от Apache Commons Lang:

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

Если вы используете стандартный регистратор: 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 и метательного.

+0

Приведенный выше пример не печатает stacktrace. – Luniam

+0

@ Luniam Я отредактировал ответ, дающий полный пример – dsantaolalla

Смежные вопросы