处理 NSData (Data) 范围异常

Handling NSData (Data) range exceptions

使用NSData(或Data)使用getBytescopyBytes)读取字节会抛出NSRangeException。不知道怎么抓。

我知道对于 NS 类,包括 NSData,我将不得不使用 Objective-C 包装器来捕获和处理异常,但我有点惊讶看到 Data 也会抛出 Swift 无法本地处理的异常。

我是不是遗漏了什么明显的东西?有什么办法可以捕捉到那些使用纯 Swift 的人吗?或者是否有任何其他方法会抛出 Swift 可处理的错误?

失败的代码示例(实际上我使用的是从文件创建的数据)

// Using NSData

let dataBytes:[UInt8] = [0xff, 0x00, 0x11, 0x22]
let data = NSData(bytes: dataBytes, length: dataBytes.count)
let dataRange = NSRange(location: 2, length: 4)

var result = [UInt8](repeating: 0, count: 4)

do
{
    try data.getBytes(&result, range: dataRange)
    print("OK")
}
catch
{
    print("FAIL")
}


// Using Data

let dataBytes:[UInt8] = [0xff, 0x00, 0x11, 0x22]
let data = Data(dataBytes)
let dataRange = Range(2..<6)

var result = [UInt8](repeating: 0, count: 4)

do
{
    try data.copyBytes(to: &result, from: dataRange)
    print("OK")
}
catch
{
    print("FAIL")
}

注意:有问题的代码还显示了两个警告(正如预期的那样,因为 Swift 无法处理这些警告)但我添加了那些 try...catch 块只是为了显示我想要使用的内容。

No calls to throwing functions occur within 'try' expression

'catch' block is unreachable because no errors are thrown in 'do' block

您需要检查您正在使用的范围的上限索引是否超出您的数据范围:

if dataRange.upperBound <= data.count {
    data.copyBytes(to: &result, from: dataRange)
}

你可以把 Data 想成 array/collection。 copyBytes 将在没有可捕获异常的情况下失败,原因与 anArray[1] 将对单个项目数组失败相同。