11

以前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 例外を処理するにはどうすればよいですか?

4

2 に答える 2

1

それ以来ハイジャックされた Web サイトから (その理由でリンクを提供していませんが、説明はまだ役に立ちます):

seekToEndOfFile() と writeData() はスローとしてマークされていません (do-try-catch ブロックでキャッチできる NSError オブジェクトをスローしません)。これは、Swift の現在の状態では、それらによって発生した NSExceptions を意味します。 「捕まえる」ことはできません。

Swift プロジェクトに取り組んでいる場合は、NSExceptions をキャッチする NSFileHandle メソッドを実装する Objective-C クラスを作成できますが (この質問のように)、そうしないと運が悪くなります。

于 2018-02-09T14:52:10.297 に答える