如果路由参数无效,则在 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”

在 Angular 中捕获路由参数的最佳位置在哪里

[系列] go-gin-api 路由中间件 - 捕获异常

go-gin-api 路由中间件 - 捕获异常

如果未捕获后的组,则在第一个捕获组后忽略空间