我是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时,一切都很好
但是,如果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)
            })
        }
    }

谢谢!

最佳答案

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

10-04 22:06