2013-06-05 13 views
5

Questo potrebbe essere un problema piuttosto ampio, ma non sono riuscito a trovare alcun riferimento alle risorse online o a spiegare la questione.NSFileHandle writeData: gestione delle eccezioni

La domanda è dopo aver creato NSFileHandle *writer = [NSFileHandle fileHandleForWritingAtPath:"path"] e quando si utilizza [writer writedata:"NSData"] ci sono eccezioni possibili seno che potrebbero sparare secondo il documento apple.

"Questo metodo solleva un'eccezione se il descrittore di file è chiuso o è non valida, se il ricevitore rappresenta un tubo scollegato o presa endpoint, se lo spazio libero è lasciato sul file system, o se qualsiasi altro errore di scrittura si verifica ". - APPLE DOC

Tutto quello che voglio sapere è c'è un modo siamo in grado di gestire o convalidare questi problemi senza l'utilizzo di alcun tentativo di cattura o il controllo per ogni errore in una condizione di controllo prima della scrittura. In ogni modo possibile possiamo usare NSError per gestire questo?

risposta

7

Direi "No". Se sei riuscito a trovare un test che coprisse tutti i possibili errori prima della scrittura, allora non c'è nulla da dire che l'operazione di scrittura potrebbe fallire dopo questo test iniziale (pensa di scrivere su un filesystem con 1 KB gratis e vuoi scrivere 4KB).

Pertanto il blocco delle chiamate a questi metodi all'interno di un blocco @try/@catch mi sembra l'approccio migliore. Questi wrapper potrebbero quindi restituire un NSError ** se si desiderano i dettagli dell'errore (che sicuramente si dovrebbe desiderare).

- (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; 
} 

Sarà sicuramente vuole ottenere il motivo dell'errore nella NSError, ma non è immediatamente evidente a me come fare per fare questo.