处理NSData(数据)范围异常

时间:2016-10-19 18:24:45

标签: swift exception-handling swift3 nsdata

使用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块只是为了显示我想要使用的内容。

  

在'try'表达式

中没有调用抛出函数      

'catch'块无法访问,因为'do'块

中没有抛出任何错误

1 个答案:

答案 0 :(得分:2)

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

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

您可以将Data视为数组/集合。由于同一原因copyBytes对单个项目数组失败,anArray[1]将在没有可捕获异常的情况下失败。