2013-06-05 14 views
5

To może być raczej szeroki problem, ale nie mogłem znaleźć żadnego zasobu internetowego zajmującego się tym problemem.NSFileHandle writeData: obsługa wyjątków

Pytanie jest po utworzeniu NSFileHandle *writer = [NSFileHandle fileHandleForWritingAtPath:"path"] i podczas korzystania z [writer writedata:"NSData"] jest możliwe wyjątek, który może strzelać zgodnie z doc dokumentem.

„metoda zgłasza wyjątek, że deskryptor jest zamknięty czy nie jest ważny, gdy odbiornik stanowi niepodłączone rury lub gniazdo końcowego, jeśli brak miejsca pozostaje w systemie plików, lub jeżeli pojawia się inny błąd zapisu: . " - APPLE DOC

Chcę wiedzieć, czy jest jakiś sposób możemy obsłużyć lub potwierdzić te problemy bez użycia catch try lub sprawdzanie każdego błędu w czeku stan zanim napiszesz. W jaki sposób możemy użyć NSError do obsługi tego?

Odpowiedz

7

Powiedziałbym "nie". Jeśli udało Ci się znaleźć test obejmujący wszystkie możliwe awarie przed pisaniem, to nie ma nic do powiedzenia, że ​​operacja zapisu może się nie powieść po tym początkowym teście (pomyśl o zapisaniu do systemu plików z 1KB za darmo i chcesz napisać 4KB).

W związku z tym zawijanie połączeń do tych metod wewnątrz bloku @try/@catch wydaje mi się najlepszym podejściem. Owijarki te mogą następnie zwrócić NSError **, jeśli chcesz uzyskać szczegóły dotyczące awarii (której na pewno chcesz).

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

Na pewno chcesz dostać przyczynę awarii do NSError, ale to nie jest oczywiste dla mnie, jak go o to robi.