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

Я использовал NSFileHandle для записи данных в файл.

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 в моем коде?


person Yifan Wang    schedule 23.05.2014    source источник
comment
Вы когда-нибудь находили решение этой проблемы?   -  person Icydog    schedule 18.12.2014


Ответы (2)


С веб-сайта, который был взломан с тех пор (по этой причине ссылка не указана, но объяснение все еще полезно):

seekToEndOfFile() и writeData() не помечены как броски (они не генерируют объект NSError, который может быть перехвачен блоком do-try-catch), что означает, что в текущем состоянии Swift NSExceptions, вызванные ими нельзя "поймать".

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

person Eric    schedule 09.02.2018

То, что сказал @eric, верно. Но что вы можете сделать, так это проверить перед тем, как вы пишете, сколько места осталось на диске, и только после этого писать на диск.

person Elisha Sterngold    schedule 24.12.2018