如果路由参数无效,则在 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 版以上是实验性的。