我是科特林世界的新手。所以我有一些问题。我正在使用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)
})
}
}
寻求帮助!
答案 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版以上是实验性的。