我是Kotlin世界的新手。所以我有一些问题。我正在使用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)
})
}
}
谢谢!
最佳答案
您可以执行一个简单的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
功能一起使用。请注意,Location
在ktor 1.0版以上是实验性的。