如何从闭包中强制捕获?

How to force a catch from a closure?

假设在Objective-C中有以下情况:一个块数组。

所以我想运行一个街区,我这样做:

myBlock block = blocks[0](); 

现在想象一下 运行s 在 try:

myBlock block = blocks[0];
@try {
  block();
} @catch {
  // catch an error
}

现在想象一下,我想在块内添加一行以强制捕获。

我在 objective-C 中所做的是将这一行添加到一个块中

[NSException raise:@"Failed" format:@"Failed", nil];

现在我想在 Swift

let myClousure = closures[0]

do {
   myClosure!()
} catch {
}

问题是:我应该在闭包中添加哪一行来强制执行相同的行为,或者换句话说,使闭包失败并触发捕获?

抱歉,如果这个问题很愚蠢,但我是 Swift 的新手。

在 Objective-C 中,您使用 @try/@catch 块来处理 ObjC 异常,例如您提出的异常。在 Swift 中,您使用 do/catch 块来捕获 Swift 明确从 "throwing" 函数抛出的错误。只有用"throws"关键字标记的函数(和闭包)才允许抛出错误,如果你调用了一个可以抛出的函数,你必须处理错误。

如果你有一个闭包数组,闭包的类型签名必须指定它可以抛出,例如

let blocks: [() throws -> Void] = // get some blocks

此时,您可以(而且确实必须)处理通过调用这些块抛出的任何错误:

let block = blocks[0]
do {
    try block()
} catch let error {
    print(error)
}