Swift关闭异常处理

时间:2018-09-21 09:48:53

标签: swift closures swift4

我用这种方式定义了一个闭包:

 let processor: (MyBuffer) throws -> MyBuffer { buffer in

    let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer)
    return outputBuffer

 }

self.processBuffer()如果无法输出有效的非nil缓冲区,则会引发异常。但是Swift编译器抱怨返回类型是可选的。我的问题是,应对这种情况的唯一正确方法是强行打开可选包装,否则有更好的处理方法?

4 个答案:

答案 0 :(得分:1)

使用try代替try?。如果抛出processBuffer,那么未关闭的错误将从您的闭包中抛出。否则,您将有一个有效的outputBuffer返回。

let processor: (MyBuffer) throws -> MyBuffer = { buffer in

    let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
    return outputBuffer

}

答案 1 :(得分:0)

在这种情况下,缓冲区可能会失败,并且您的返回类型表示始终应返回缓冲区 可以尝试做很多事情,其中​​之一将返回类型更改为-> MyBuffer?

当您使用processor时,可以使用guard letif let

使用!强制展开会产生风险,就好像在任何时候如果值是nil,应用都会崩溃

在Swift文档here

中了解有关可选链接的更多信息。

答案 2 :(得分:0)

强制包装值可能很危险,因为它可能导致应用程序崩溃。

进行强制换行,当您确定(100%)拍摄时,可选项将在任何给定时间包含一个值。

let processor: (MyBuffer) throws -> MyBuffer? { buffer in
     guard let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer) else { return nil }
     return outputBuffer
}

要调用以下内容,请确保在使用之前获得所需的buffer

guard let buffer = try? processor else { // no buffer was processed, hence you don't proceed the control flow.
    return
}
// you got processed buffer, hence use it.

答案 3 :(得分:0)

您可以再次引发异常或对其进行处理。

如果要处理它,则必须将代码包装到do-catch中,然后:

 let processor: (MyBuffer) -> MyBuffer{ buffer in

 do{
   let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)
   return outputBuffer
}catch HERE_THE_ERROR_TYPE{
 //HERE HOW TO HANDLE THE ERROR
}

}

此外,如果您要抛出错误,则:

 let processor: (MyBuffer) throws -> MyBuffer{ buffer in

let outputBuffer = try self.processBuffer(self, inputBuffer: buffer)

return output

 }

然后,您可以处理闭包调用中的错误,也可以再次抛出该错误。

现在,请注意,如果您的函数引发错误,则可以使用可选方法来处理它,就像您所做的一样。这意味着您必须处理或检查可选值(guard-let,if-let或您喜欢的值)。这就是为什么如果函数processBuffer引发错误,它将为outputBuffer分配一个nil值,这意味着您不需要throws声明:

 let processor: (MyBuffer) -> MyBuffer?{ buffer in

let outputBuffer = try? self.processBuffer(self, inputBuffer: buffer)
//HERE YOU CAN CHECK IF OUTPUT_BUFFER IS NIL OR NOT
// Otherwise a nil value can be returned
return output

 }

有关更多信息,请查看以下文档: Swift error handling