kotlin 没有受检异常真太难顶了。吐槽

40 天前
 jeesk
  1. 比如我要统一处理登陆失败和网络错误。

如果是在 java 里面直接在方法里面抛出 2 个异常即可。 但是在 kotlin 里面必须

	val runResult = runCatching{
       HttpResponse(it.isSuccessful,it.code,it.message)
    }
    if(runResult.isFailure){
       when(moveFileAgain.exceptionOrNull()){
        // 单独处理异常
          
       }
    
    }
    // 还有写一些(这里请求成功了)
    if(result.code == 404){
       return runResult.getOrDefault()
    }
      if(result.code == 401){
        // 认证失败了
       return runResult.getOrDefault()
    }
   

如果是在 java 里面就再简单不过了,直接定义两个异常,全局处理. 受检查异常是真的爽。 特别是在嵌套请求,1 个 api 要请求好几次的情况。

这么说吧。 这里面的很多常见使用 java 来写代码可能要简单的多。 哪有这么多的破事。

大佬们有什么办法处理这种事情, 我的要求就是登陆 401 或者有异常直接返回就是了。kotlin 实在是太繁琐了。

3524 次点击
所在节点    Kotlin
42 条回复
RicardoY
40 天前
没有看懂这和受检异常的关系是什么,你用 kotlin 不一样可以抛出自定义异常吗
winterbells
40 天前
同样看不懂你要什么

val exception = Exception("401")

if (xxx) throw exception
zhwguest
40 天前
我猜 op 的意思是在收到非 2xx 状态码的时候抛出异常。

但是这个是 API 的特性,而不是语言的特性。比如 okhttp ,ktor 等。api 一般都有选项可以设置什么时候抛出异常,什么时候认为是正常的 response 。
sagaxu
40 天前
unchecked exception 和 checked exception ,唯一区别就是 unchecked 可以隐式想上传递,checked 必须包在 try 中或者在方法签名中显式声明。

调用链路的上层,IDE 会提示哪些 checked exception 没有处理,而 unchecked exception 你无法知道可能会抛出哪些异常。所以 Kotlin 使用 @Throws(IOException::class)把信息包含进去。

所以 OP 在 Kotlin 中同样可以“直接定义两个异常,全局处理”。但很遗憾,他用 runCatching 吃掉了异常,然后手动处理,把 Kotlin 写出了 Go 的感觉。
superchijinpeng
40 天前
有没有可能是你不会用
hwb
40 天前
有没有可能是你不会用
chendy
40 天前
看到标题:怎么会有人喜欢 Checked Exception 呢?
看完内容:果然说的不是 Checked Exception

代码封装或者风格的问题,和语言不能说毫无关系只能说毫无关系
yuhuazhu
40 天前
自己定义一个方法统一判断然后抛出异常,
然后 BaseViewModel 的写一个协程的扩展函数去处理异常,
比如你给这个函数起名字叫 runCatching
Vaspike
40 天前
java 能做的 kotlin 一定能做
jeesk
40 天前
@Vaspike 能帮我强制处理异常不? 我嵌套 10 几个函数, 如果没有受检查异常, 每个都要单独判断. 处理工作量大幅增加. 现在只能将异常封装在函数返回值里面.
location123
40 天前
使用 OkHttp 的情况下
只是判断这个请求的 http 请求错误 可以判断异常父类是否是 HttpException
inline fun <T : HttpService, R> T.execute(block: T.() -> BaseResponse<R>): Result<R> {
return try {
val response = block()
if (response.success) {
Result.Success(response.data)
} else {
//内置协议错误
// Result.Fail(response.header.code.toInt(), response.header.msg, false)
}
} catch (e: HttpException) {
//http fail
} catch (e:CancellationException){
//cancel
} catch (e: Exception) {
//other fail
}
}
网络请求全部走 HttpService 的扩展函数

第二种
在协程的顶级作用域里面统一处理
chendy
40 天前
@jeesk 再封装一层,异常情况直接甩异常出来
maninfog
40 天前
Java 能抛的异常,Kotlin 也能抛。只是说 Kotlin 对于 Checked Exception (CE) 没了编译器的保护,up 觉得不太安全?
关于 Kotlin 取消 CE ,褒贬不一,想起这个文章: https://www.yinwang.org/blog-cn/2017/05/23/kotlin
jeesk
40 天前
@chendy 目前就是用 runtrycatch 了, 如果有异常, 直接将异常回填到返回值了。
jeesk
40 天前
@maninfog 某些情况下合理使用受检查异常, 能省下很多的代码。
cmdOptionKana
40 天前
Checked Exception 与 Go 的 error 貌似有共通的思想。
githmb
40 天前
《提问的艺术》
jeesk
40 天前
@githmb 我这不是吐槽吗?
AoEiuV020JP
40 天前
没懂,throw, try, catch, 哪个是 kotlin 办不到的,效果明明和 java 一样,
你要不试试用 java 写了再一键转成 kotlin 看看再说有什么问题,
yazinnnn0
40 天前
这跟嗑特灵有啥关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1079399

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX