Использование NSData
(или Data
) для чтения байтов с использованием getBytes
(copyBytes
) может вызывать исключение NSRangeException. Я не знаю, как их поймать.Обработка исключений диапазона NSData (данных)
Я знаю, что для NS
классов, в том числе NSData
, я бы использовать Objective-C обертку, чтобы перехватывать и обрабатывать исключения, но я немного удивлен, что Data
также бросает исключение, 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
блок, чтобы показать, что я хочу использовать.
Никаких вызовов к метательным функциям не происходят в «попробовать» выражение
блок «поймать» недоступен из-за ошибками не выбрасывается в «делать» блок
'Data copyBytes' не выбрасывает, поэтому ничего не поймать. – rmaddy
@rmaddy Ну, вот в чем проблема. Он не бросает, но это приводит к сбою приложения. Наклонение на Objective-C похоже на трехногий конь в гоночной трассе ... Есть ли способ обойти это? Использование copyBates не является обязательным - речь идет о функциональности, которую он предоставляет. –
'NSRangeException' не может быть обнаружен во время выполнения с потоком' do-try-catch'. Это ошибка программирования, вы выходите из диапазона типа коллекции. – JAL