2016-10-19 6 views
0

getBytes (copyBytes)을 사용하여 바이트를 읽는 데 NSData (또는 Data)을 사용하면 NSRangeException을 throw 할 수 있습니다. 나는 그들을 붙잡는 법을 모른다.NSData (데이터) 범위 예외 처리

나는 NSData 포함 NS 클래스를 들면, 나는 예외를 잡아서 처리하기 위해 목표 - C 래퍼를 사용해야한다는 것을 알고 있지만 나는 놀라지 조금 Data는 스위프트가 기본적으로 처리 할 수없는 예외가 발생 있는지입니다.

나는 분명한 뭔가를 놓치고 있습니까? 순수 스위프트를 사용하는 사람들을 잡을 수있는 방법이 있습니까? 아니면 신속한 처리 오류를 던질 다른 방법이 있습니까? (실제로 내가 파일에서 생성 된 데이터를 사용하고) 실패

코드 예제는

// 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") 
} 

참고 : 문제의 코드는 (스위프트가 사람들을 처리 할 수 ​​없기 때문에, 예상대로)이 경고를 표시하지만 그 블록을 try...catch 블록에 추가하여 사용하고 싶은 것을 보여줍니다. 던지는 기능에

된 통화는

+1

'데이터 copyBytes'는 던지지 않으므로 잡을 것이 없습니다. – rmaddy

+0

@rmaddy 글쎄, 그게 문제의 핵심이야. 그것은 던지지 않지만 응용 프로그램이 충돌합니다. Objective-C에 기대는 것은 경마장에 3 개의 다리가 달린 마차가있는 것과 같습니다 ...이 문제를 해결할 방법이 있습니까? copyBates를 사용하는 것이 필수적인 것은 아닙니다. 이는 그것이 제공하는 기능에 관한 것입니다. –

+0

'NSRangeException'은'do-try-catch' 흐름으로 런타임에 잡힐 수 없습니다. 프로그래밍 오류입니다. 컬렉션 유형 범위를 벗어납니다. – JAL

답변

1

당신은 확인해야 할 오류가 '할'블록에서 발생하지 않기 때문에

'캐치'블록이 도달 할 수없는 표현 '시도'내에서 발생하지하여

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

당신은 더 배열/콜레 같은 Data 생각할 수 있습니다 : 당신이 사용하고있는 범위의 상단 지수는 데이터를 저장하기위한 범위를 벗어 아니다 . copyBytes은 동일한 이유로 catchable 예외없이 실패합니다. anArray[1]은 단일 항목 배열에 대해 실패합니다.