2

我是科特林世界的新手。所以我有一些问题。我正在使用 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)
            })
        }
    }

谢谢帮助!

4

1 回答 1

5

您可以做一个简单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 版以上的实验性版本。

于 2019-01-27T22:43:49.313 回答