如果路由参数无效,则在 Ktor 位置捕获异常
Posted
技术标签:
【中文标题】如果路由参数无效,则在 Ktor 位置捕获异常【英文标题】:Catch exception in Ktor-locations if non valid route parameter 【发布时间】:2019-06-20 20:15:31 【问题描述】:我是 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
但是如果路由将是/show/test
则有NumberFormatException
,导致DefaultConversionService
尝试将id 转换为Int 并且不能这样做。
所以我的问题是,我怎样才能捕捉到这个异常并返回带有一些错误数据的 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)
)
谢谢帮助!
【问题讨论】:
【参考方案1】:您可以做一个简单的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-locations(在代码的第一部分)来做到这一点,但你解释了第二部分。这部分代码我只是展示了一个例子,我如何在没有位置的情况下做到这一点。 抱歉,一开始不太清楚。我更新了我的答案,希望对您有所帮助。 Thx Ervin,你的第二个解决方案帮助了我)但是你为什么说位置已经过时了?如我所见,现在它是实验性功能,例如,您可以在此处看到 (ktor.io/quickstart/migration/1.1.2.html) 有注释:“在开箱即用的位置支持” 你说得对,它是实验性的,没有过时。我的错。以上是关于如果路由参数无效,则在 Ktor 位置捕获异常的主要内容,如果未能解决你的问题,请参考以下文章
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:indexPath!= nil”
由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:self.senderId!= nil”