You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在KMM中如何将Kotlin捕获的自定义Swift错误转回Swift?

在KMM中将捕获的Swift自定义错误转回原类型的解决方案

直接解决方案:Swift端类型转换

当Swift的MyError被抛到Kotlin层后,会被KMM包装为KotlinThrowable对象。在Swift端调用asError()可以还原为原始的Swift Error实例,之后通过类型转换即可转回MyError:

func passToIosCode(err: KotlinThrowable) {
    // 将KotlinThrowable转回Swift Error,再向下转换为自定义的MyError
    guard let myError = err.asError() as? MyError else {
        // 处理非MyError类型的错误
        print("未识别的错误:\(err.localizedDescription)")
        return
    }
    
    // 处理自定义错误
    switch myError {
    case .runtimeError(let message):
        print("捕获到自定义运行时错误:\(message)")
    }
}

关键原理

KMM在跨语言异常传递时,会完整保留原始Swift Error的类型信息:

  • Swift抛出的Error会被封装为KotlinThrowable在Kotlin层传递
  • 调用KotlinThrowable.asError()方法可以还原出原始的Swift Error实例
  • 利用Swift的类型转换(as?)即可将通用Error转成你的自定义MyError枚举

注意事项

  • 确保MyError枚举的访问级别是public,否则KMM生成的代码无法正确识别该类型
  • 如果自定义Error包含关联值(比如示例中的String),转换后关联值会完整保留,可以正常访问
  • 避免在Kotlin层对捕获到的Throwable进行二次包装(比如重新抛出为Kotlin的Exception),否则会丢失原始Swift Error的类型信息

进阶方案:跨平台统一异常定义

如果需要在Kotlin层也能识别并处理该错误,可以在KMM的Common模块定义对应的异常类,然后在Swift端直接抛出该异常:

  1. 在Common模块定义Kotlin异常:
class MyRuntimeError(message: String) : Exception(message)
  1. 在Swift端抛出该异常:
func someThrowableMethod() throws {
    throw MyRuntimeError(message: "my custom error")
}
  1. 此时Kotlin层可以直接捕获MyRuntimeError,传回Swift后也能直接处理对应的包装类:
func passToIosCode(err: KotlinThrowable) {
    if let myError = err as? MyRuntimeError {
        print("捕获到跨平台错误:\(myError.message ?? "")")
    }
}

内容的提问来源于stack exchange,提问作者Arsenius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:03:36