如何创建可实现someKindOfCode.tryCatch()调用的Kotlin扩展函数
问题分析
你编写的Any扩展函数无法达到预期效果的核心原因是代码求值时机错误:当你调用xxx.tryCatch()时,xxx代表的代码逻辑会先完成执行、得到结果值后,才会触发结果实例的tryCatch扩展方法。此时try块中仅持有已经计算完成的结果值,根本不会捕获代码执行过程中抛出的异常。
正确实现方案
你需要将扩展函数的接收者改为无参函数类型,利用Lambda的惰性执行特性,让目标代码逻辑在try块内部才执行:
private fun <T> (() -> T).tryCatch(): T? { return try { // 此处才真正执行传入的代码逻辑 this() } catch (e: Exception) { Log.e(TAG, "tryCatch: ", e) // 异常场景可根据需求调整返回值,比如返回默认值而非null null } }
调用方式
和你预期的调用形式完全匹配,将需要执行的代码放入Lambda作为接收者即可:
{ // 此处放置需要异常捕获的业务代码 val riskyResult = 100 / 0 otherRiskyMethod() }.tryCatch()
如果你需要拿到代码的执行返回值,直接接收方法返回结果即可:
val result = { getRiskyData() }.tryCatch()
内容的提问来源于stack exchange,提问作者Alireza Mahfouzian
相关产品推荐
相关产品推荐

