2014-05-23 19 views
9

Ich habe NSFileHandle verwendet, um Daten in eine Datei zu schreiben.Ich kann die Ausnahme "No space left on device" nicht abfangen, wenn ich NSFileHandle writedata-Funktion verwende

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

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

Als mein Gerät Speicherplatz voll ist, ruft writedata fehl. Aber ich kann die Ausnahme nicht verstehen.

Mein Programm Protokollinfo:

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 

Ich fand heraus, writedata ruft eine Versendung in das Dateisystem in Echtschreibdaten zu tun. Also ich denke writedata wird eine Ausnahme in GCD werfen.

Wie kann ich die GCD-Ausnahme in meinem Code behandeln?

+0

Haben Sie jemals eine Lösung gefunden? – Icydog

Antwort

0

Check out http://ioscake.com/how-to-properly-handle-nsfilehandle-exceptions-in-swift-2-0.html

seekToEndOfFile() und writedata() sind nicht markiert als Würfe (sie tun keine NSError Objekt werfen, die mit einem do-versuchen Beifang gefangen in Block werden kann) , was bedeutet, dass im aktuellen Zustand von Swift die von ihnen erhobenen NSExceptions nicht "gefangen" werden können.

Wenn Sie auf einem Swift-Projekt arbeiten, könnten Sie eine Objective-C Klasse erstellen, die Ihre NSFileHandle Methoden implementiert, die die NSExceptions fängt (wie in dieser Frage), aber sonst bist du kein Glück.