Swift中创建Thread线程时如何捕获错误?为何catch块提示不可达
问题原因分析
- 外层catch块不可达的核心原因是:
Thread.start()方法并未被声明为throws方法,你强行添加try调用没有任何意义,编译器明确知道该调用不会抛出错误,因此判定后续的catch块永远不会触发,自然会给出不可达的提示。 - 另外一个核心误区:线程是独立的执行上下文,
threadmain函数内的代码运行在你新创建的子线程栈上,它内部产生的所有错误、异常完全不会传递到调用start()的原线程栈中,所以你不可能在this()函数里捕获到子线程内部抛出的错误。
关于
executing状态检查的问题 只检查executing状态完全无法满足你的需求:executing仅能标识线程是否处于运行状态,无法感知线程内部是否产生了错误、是否因为未捕获的异常中止运行。
正确实现方案
- 首先删除外层无效的
do/catch和try关键字 - 如果需要感知子线程内部的错误,你需要自行实现错误状态的传递逻辑,示例参考如下:
// 新增属性存储子线程抛出的错误 var threadError: Error? @objc func threadmain(){ do{ // 可能抛出错误的业务逻辑写在这里 } catch{ // 内部捕获到错误后存储到属性 threadError = error // 如果需要通知主线程处理错误,可在这里触发主队列回调 DispatchQueue.main.async { print("子线程捕获到错误: \(error)") // 执行对应错误处理逻辑 } } } func this(){ myThread = Thread (target: self, selector: #selector(threadmain), object: nil) // 直接调用start,不需要加try myThread.start() // 如果需要主动检查状态,可以自行判断属性值 // if myThread.isExecuting { ... } // if let error = threadError { ... } }
内容的提问来源于stack exchange,提问作者Aldo Ortega
相关产品推荐
相关产品推荐

