使用NSData
(或Data
)使用getBytes
(copyBytes
)读取字节可能会抛出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'块
中没有抛出任何错误
答案 0 :(得分:2)
您需要检查您使用的范围的上部索引是否超出您的数据范围:
if dataRange.upperBound <= data.count {
data.copyBytes(to: &result, from: dataRange)
}
您可以将Data
视为数组/集合。由于同一原因copyBytes
对单个项目数组失败,anArray[1]
将在没有可捕获异常的情况下失败。