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

Swift中创建Thread线程时如何捕获错误?为何catch块提示不可达

问题原因分析
  • 外层catch块不可达的核心原因是:Thread.start()方法并未被声明为throws方法,你强行添加try调用没有任何意义,编译器明确知道该调用不会抛出错误,因此判定后续的catch块永远不会触发,自然会给出不可达的提示。
  • 另外一个核心误区:线程是独立的执行上下文,threadmain函数内的代码运行在你新创建的子线程栈上,它内部产生的所有错误、异常完全不会传递到调用start()的原线程栈中,所以你不可能在this()函数里捕获到子线程内部抛出的错误。

关于executing状态检查的问题

只检查executing状态完全无法满足你的需求:executing仅能标识线程是否处于运行状态,无法感知线程内部是否产生了错误、是否因为未捕获的异常中止运行。


正确实现方案
  1. 首先删除外层无效的do/catch和try关键字
  2. 如果需要感知子线程内部的错误,你需要自行实现错误状态的传递逻辑,示例参考如下:
// 新增属性存储子线程抛出的错误
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:18:03