5

これはかなり広範な問題である可能性がありますが、この問題に対処または説明しているオンライン リソースは見つかりませんでした。

質問は作成後NSFileHandle *writer = [NSFileHandle fileHandleForWritingAtPath:"path"]であり、使用する[writer writedata:"NSData"]と、アップルのドキュメントに従って発生する可能性のある例外が発生する可能性があります。

「このメソッドは、ファイル記述子が閉じているか有効でない場合、レシーバーが接続されていないパイプまたはソケット エンドポイントを表している場合、ファイル システムに空き領域が残っていない場合、またはその他の書き込みエラーが発生した場合に例外を発生させます。」- アップルドキュメント

私が知りたいのは、try catch を使用したり、書き込み前の条件チェックで各エラーをチェックしたりせずに、これらの問題を処理または検証できる方法があるかどうかです。これを処理するために使用できる方法はありますNSErrorか?

4

1 に答える 1

7

私は「いいえ」と言うでしょう。書き込み前に起こりうるすべての失敗をカバーするテストを見つけることができた場合、この最初のテストの後に書き込み操作が失敗する可能性があることは言うまでもありません (1KB の空き容量があるファイルシステムに書き込み、4KB を書き込みたいと考えてください)。

したがって、これらのメソッドへの呼び出しをブロック内にラップする@try/@catchのが最善の方法のように思えます。これらのラッパーはNSError **、失敗の詳細が必要な場合に を返すことができます (これは間違いなく必要です)。

- (BOOL)writeData:(NSData *)data
     toFileHandle:(NSFileHandle *)fileHandler
            error:(NSError **)error
{
    @try
    {
        [fileHandler writeData:data];
    }
    @catch (NSException *e)
    {
        if (error != NULL)
        {
            NSDictionary *userInfo = @{ 
                NSLocalizedDescriptionKey : @"Failed to write data",
                // Other stuff?
            };
            *error = [NSError errorWithDomain:@"MyStuff" code:123 userInfo:userInfo];
        }
        return NO;
    }
    return YES;
}

失敗の理由を に取得したいのは確かですが、NSErrorこれを行う方法はすぐにはわかりません。

于 2013-06-05T12:14:26.313 に答える