2014-05-23 3 views
9

Я использовал NSFileHandle, чтобы передать файл в файл.Я не могу поймать исключение «Отсутствие пробела на устройстве» при использовании функции NSFileHandle writedata

NSFilehandle *handle = [NSFileHandle fileHandleForWritingAtPath:@"path/of/file"]; 

@try { 
    [handle writedata:data]; 
} @catch (NSException *e) { 
    // when exception occur, never got here 
    NSLog(@"%@", e); 
} 

Поскольку мое устройство дискового пространства заполнена, вызывая writedata потерпит неудачу. Но я не могу поймать исключение.

Моя информация журнал программы:

2014-05-23 16:17:24.435 mytest[12919:3203] An uncaught exception was raised 
2014-05-23 16:17:24.435 mytest[12919:3203] *** -[NSConcreteFileHandle writeData:]: 
     No space left on device 
2014-05-23 16:17:24.436 mytest[12919:3203] (
0 CoreFoundation 0x00007fff8fae725c __exceptionPreprocess + 172 
1 libobjc.A.dylib 0x00007fff8cbb3e75 objc_exception_throw + 43 
2 CoreFoundation 0x00007fff8fae710c +[NSException raise:format:] + 204 
3 Foundation 0x00007fff93640f31 __34-[NSConcreteFileHandle writeData:]_block_invoke + 84 
4 Foundation 0x00007fff93840020 __49-[_NSDispatchData enumerateByteRangesUsingBlock:]_block_invoke + 32 
5 libdispatch.dylib 0x00007fff8bfc2fad _dispatch_client_callout3 + 9 
6 libdispatch.dylib 0x00007fff8bfc2f28 _dispatch_data_apply + 113 
7 libdispatch.dylib 0x00007fff8bfc9502 dispatch_data_apply + 31 
8 Foundation 0x00007fff9383fff9 -[_NSDispatchData enumerateByteRangesUsingBlock:] + 83 
9 Foundation 0x00007fff93640ed2 -[NSConcreteFileHandle writeData:] + 150 
10 ZiSyncMac 0x000000010000b1eb -[TransferFile writePart:data:] + 475 

я узнал writedata вызывает отправку делать реальные данные записи в файловую систему. Поэтому я думаю, что writedata сделает исключение в GCD.

Как я могу обработать исключение GCD в своем коде?

+0

Вы когда-нибудь находили решение этого вопроса? – Icydog

ответ

0

Заканчивать http://ioscake.com/how-to-properly-handle-nsfilehandle-exceptions-in-swift-2-0.html

seekToEndOfFile() и WriteData() не помечаются как броски (они не бросить объект NSError, который может быть пойман с использованием сделай попробовать прилов блок) , что означает в текущем состоянии Swift, NSExceptions , поднятый ими, не может быть «пойман».

Если вы работаете на Swift проект, вы можете создать Objective-C класс, который реализует свои NSFileHandle методы, которые улавливает NSExceptions (как в этом вопросе), но в противном случае вы из удачи.