Как получить данные внутри объекта Throwable Scala? - PullRequest
1 голос
/ 20 июня 2019

Как я могу получить информацию внутри Throwable объекта Scala?

Код является примером throwable.getMessage.

JsResultException(errors:List((,List(JsonValidationError(List('eoh' is undefined on object: {"store":"8767565","sku":"1983278364782364782"}),WrappedArray())))))

Мне нужно извлечь JsResultException, JsonValidationError как строка, сообщение 'eoh' is undefined on object сообщение и JSON перед object:.

Это для создания изящного журнала.

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Рассмотрим преобразование JsResultException.errors, которое

Seq[(JsPath, Seq[JsonValidationError])]

, где JsonValidationError.errors - еще одна последовательность Seq[String], в более простой набор

Seq[(JsPath, String)]

вроде так

case JsResultException(errors) =>
  errors.map { case (path, validationErrors) => path -> validationErrors.map(_.messages.mkString(",")).mkString(",") }

Это даст более управляемую структуру, похожую на

List((/id,error.path.missing), (/name,error.path.missing))

вместо

List((/id,List(JsonValidationError(List(error.path.missing),WrappedArray()))), (/name,List(JsonValidationError(List(error.path.missing),WrappedArray())))))]

Вот рабочий пример

case class User(name: String, id: Int)
object User {
  implicit val formats = Json.format[User]
}

val raw = """{ "nam": "mario", "i": 5 }"""

try {
  Json.parse(raw).as[User]
} catch {
  case JsResultException(errors) =>
    errors.map { case (path, validationErrors) => path -> validationErrors.map(_.messages.mkString(",")).mkString(",") }
}

Также рассмотрим , используя проверку , чтобы избежать создания исключений, подобных

Json.parse(raw).validate[User] match {
  case s: JsSuccess[User] => s
  case JsError(errors) => 
    errors.map { case (path, validationErrors) => path -> validationErrors.map(_.messages.mkString(",")).mkString(",") }
}
0 голосов
/ 20 июня 2019

Вы всегда можете использовать scala.util.Try и шаблон, соответствующий Failure.

import scala.util._

def someExceptionThrowingMethod(): T = ???

Try(someExceptionThrowingMethod()) match {
    case Success(t: T) => ???
    case Failure(exception: Throwable) => exception match {
        case JsResultException((_, JsonValidationError(headMessage :: _) :: _, _) :: _) => 
          //here headMessage is the 'eoh' is undefined on object: {"store":"8767565","sku":"1983278364782364782"} message you wrote above
        case otherException: Throwable => ???
    }
}
...