2016-10-19 6 views
0

Использование 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 блок, чтобы показать, что я хочу использовать.

Никаких вызовов к метательным функциям не происходят в «попробовать» выражение

блок «поймать» недоступен из-за ошибками не выбрасывается в «делать» блок

+1

'Data copyBytes' не выбрасывает, поэтому ничего не поймать. – rmaddy

+0

@rmaddy Ну, вот в чем проблема. Он не бросает, но это приводит к сбою приложения. Наклонение на Objective-C похоже на трехногий конь в гоночной трассе ... Есть ли способ обойти это? Использование copyBates не является обязательным - речь идет о функциональности, которую он предоставляет. –

+0

'NSRangeException' не может быть обнаружен во время выполнения с потоком' do-try-catch'. Это ошибка программирования, вы выходите из диапазона типа коллекции. – JAL

ответ

1

Вы должны проверить, что верхний индекс диапазона, который вы используете, не выходит за пределы диапазона для данных:

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

вы можете думать о Data больше как массив/Колле фикция. copyBytes завершится с ошибкой без исключения для исключения по той же причине anArray[1] не будет работать для одного массива элементов.