处理 NSData (Data) 范围异常
Handling NSData (Data) range exceptions
使用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
块只是为了显示我想要使用的内容。
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]
将对单个项目数组失败相同。
使用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
块只是为了显示我想要使用的内容。
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]
将对单个项目数组失败相同。