如果路由参数无效,则在Ktor位置捕获异常

时间:2019-01-27 18:43:35

标签: kotlin ktor

我是科特林世界的新手。所以我有一些问题。我正在使用ktor框架,并尝试使用ktor-locations(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时,一切都很好 但是,如果route为/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 :(得分:1)

您可以执行简单的<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.4.0-RC1</version> </dependency> 来捕获无法将字符串转换为整数时引发的解析异常。

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" }) } } 模块:

StatusPages

这应该与使用install(StatusPages) { // catch NumberFormatException and send back HTTP code 400 exception<NumberFormatException> { cause -> call.respond(HttpStatusCode.BadRequest) } } 功能一起使用。请注意,Location在ktor 1.0版以上是实验性的。