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

134 天前
jeesk  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 实在是太繁琐了。

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

val exception = Exception("401")

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

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

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

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

代码封装或者风格的问题,和语言不能说毫无关系只能说毫无关系
yuhuazhu
yuhuazhu
134 天前
自己定义一个方法统一判断然后抛出异常,
然后 BaseViewModel 的写一个协程的扩展函数去处理异常,
比如你给这个函数起名字叫 runCatching
Vaspike
Vaspike
134 天前
java 能做的 kotlin 一定能做
jeesk
jeesk
134 天前
@Vaspike 能帮我强制处理异常不? 我嵌套 10 几个函数, 如果没有受检查异常, 每个都要单独判断. 处理工作量大幅增加. 现在只能将异常封装在函数返回值里面.
location123
location123
134 天前
使用 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
134 天前
@jeesk 再封装一层,异常情况直接甩异常出来
maninfog
134 天前
Java 能抛的异常,Kotlin 也能抛。只是说 Kotlin 对于 Checked Exception (CE) 没了编译器的保护,up 觉得不太安全?
关于 Kotlin 取消 CE ,褒贬不一,想起这个文章: https://www.yinwang.org/blog-cn/2017/05/23/kotlin
jeesk
134 天前
@chendy 目前就是用 runtrycatch 了, 如果有异常, 直接将异常回填到返回值了。
jeesk
134 天前
@maninfog 某些情况下合理使用受检查异常, 能省下很多的代码。
cmdOptionKana
134 天前
Checked Exception 与 Go 的 error 貌似有共通的思想。
githmb
134 天前
《提问的艺术》
jeesk
134 天前
@githmb 我这不是吐槽吗?
AoEiuV020JP
134 天前
没懂,throw, try, catch, 哪个是 kotlin 办不到的,效果明明和 java 一样,
你要不试试用 java 写了再一键转成 kotlin 看看再说有什么问题,
yazinnnn0
134 天前
这跟嗑特灵有啥关系

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

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

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

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

© 2021 V2EX