【问题标题】:Where to catch errors (err:ErrorType) that are thrown inside Delegate methods in Swift 2.0在哪里捕获 Swift 2.0 中的委托方法中抛出的错误 (err:ErrorType)
【发布时间】:2015-11-21 11:37:50
【问题描述】:

我想我很了解 Swift 2.0 中的 do-try-throw-catch 机制。所有抛出的错误都应该在代码的某个地方被捕获。这是我的问题:

假设我有一个 UI 分离并与控制器类通信的应用程序。在控制器类中,如果我在委托方法中抛出错误(控制器本身就是委托),我应该在哪里捕获它?

让我用一个例子来解释。

Controller 类使用来自核心蓝牙框架的 CBCentralManagerDelegate。 Controller 类是 CBCentralManager 的一个委托。还有一个 ViewController 是 Controller 类的代表。当我在里面抛出错误时会发生什么

public func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String: AnyObject], RSSI: NSNumber) 

我在哪里可以发现错误?我想我无法捕捉到它,因为核心蓝牙协议方法没有实现抛出错误,因为它们是用 Objective C 编写的。我觉得我唯一的选择是使用控制器协议方法,它告诉 UI 存在错误。我说的对吗?

Objective-C 中没有实现的委托方法呢?如何捕获用 Swift 2.0 编写的委托方法引发的错误?

【问题讨论】:

    标签: ios error-handling try-catch core-bluetooth swift2


    【解决方案1】:

    您无法捕获由 Core Bluetooth 等框架调用的委托引发的异常,这不是因为该框架是用 Objective C 编写的。

    任何抛出的异常都需要在委托方法本身(在“本地”try->catch 的情况下)或调用堆栈“向上”的某个地方捕获,在这种情况下,调用堆栈来自核心蓝牙框架->你的委托方法。

    可以定义委托协议,以便委托方法可以抛出异常以向调用委托的对象指示出现问题,但这通常通过返回值或处理程序块来完成。即使这样也无济于事,因为您试图以异步方式向不相关的对象抛出异常,因此它并没有真正映射到异常模式。

    传统方法是按照您的建议使用另一个委托/协议,或者您可以为控制器类提供错误处理块/闭包。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2020-01-04
      • 2016-04-20
      • 2023-03-28
      相关资源
      最近更新 更多