如果路由参数无效,则在 Ktor 位置捕获异常
Catch exception in Ktor-locations if non valid route parameter
我是科特林世界的新手。所以我有一些问题。我正在使用 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
但是,如果路由是 /show/test
则存在 NumberFormatException
,导致 DefaultConversionService
尝试将 id 转换为 Int 但无法执行。
所以我的问题是,如何使用一些错误数据捕获此异常和 return Json。例如,如果不使用位置,我可以像这样做 smt
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 版以上是实验性的。
我是科特林世界的新手。所以我有一些问题。我正在使用 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
但是,如果路由是 /show/test
则存在 NumberFormatException
,导致 DefaultConversionService
尝试将 id 转换为 Int 但无法执行。
所以我的问题是,如何使用一些错误数据捕获此异常和 return Json。例如,如果不使用位置,我可以像这样做 smt
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 版以上是实验性的。