在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端直接抛出该异常:
- 在Common模块定义Kotlin异常:
class MyRuntimeError(message: String) : Exception(message)
- 在Swift端抛出该异常:
func someThrowableMethod() throws { throw MyRuntimeError(message: "my custom error") }
- 此时Kotlin层可以直接捕获
MyRuntimeError,传回Swift后也能直接处理对应的包装类:
func passToIosCode(err: KotlinThrowable) { if let myError = err as? MyRuntimeError { print("捕获到跨平台错误:\(myError.message ?? "")") } }
内容的提问来源于stack exchange,提问作者Arsenius
相关产品推荐
相关产品推荐

