Поймать исключение в Ktor-местоположениях, если недопустимый параметр маршрута - PullRequest
0 голосов
/ 27 января 2019

Я новичок в мире котлинов.Так что у меня есть проблемы.Я использую ktor framework и пытаюсь использовать ktor-location (https://ktor.io/servers/features/locations.html#route-classes) И как пример

@Location("/show/{id}")
data class Show(val id: Int)

routing {
    get<Show> { show ->
        call.respondText(show.id)
    }
}

Все хорошо, когда я пытаюсь получить /show/1 Но если маршрут будет /show/test есть NumberFormatException, потому что DefaultConversionService пытается преобразовать id в Int и не может этого сделать. Поэтому мой вопрос заключается в том, как я могу перехватить это исключение и вернуть Json с некоторыми данными об ошибках. Например, если не использоватьместа, где я могу сделать что-то подобное

    routing {
        get("/{id}") {
            val id = call.parameters["id"]!!.toIntOrNull()
            call.respond(when (id) {
                null -> JsonResponse.failure(HttpStatusCode.BadRequest.value, "wrong id parameter")
                else -> JsonResponse.success(id)
            })
        }
    }

Спасибо за помощь!

1 Ответ

0 голосов
/ 28 января 2019

Вы можете сделать простое try-catch, чтобы поймать исключение при разборе, которое выдается, когда строка не может быть преобразована в целое число.

routing {
    get("/{id}") {
        val id = try {
            call.parameters["id"]?.toInt()
        } catch (e : NumberFormatException) {
            null
        }
        call.respond(when (id) {
            null -> HttpStatusCode.BadRequest
            else -> "The value of the id is $id"
        })
    }
}

Другим способом обработки исключения является использование *Модуль 1005 *:

install(StatusPages) {
    // catch NumberFormatException and send back HTTP code 400
    exception<NumberFormatException> { cause ->
        call.respond(HttpStatusCode.BadRequest)
    }
}

Это должно работать с использованием функции Location.Обратите внимание, что Location является экспериментальной версией ktor версии 1.0.

...