2013-06-05 25 views
5

Đây có thể là vấn đề khá rộng nhưng tôi không thể tìm thấy bất kỳ tài nguyên trực tuyến nào giải quyết hoặc giải thích vấn đề này.NSFileHandle writeData: xử lý ngoại lệ

Câu hỏi đặt ra sau khi tạo NSFileHandle *writer = [NSFileHandle fileHandleForWritingAtPath:"path"] và khi bạn sử dụng [writer writedata:"NSData"], có thể có ngoại lệ có thể kích hoạt theo tài liệu của apple.

"Phương pháp này đặt ra một ngoại lệ nếu mô tả tập tin là đóng hoặc là không hợp lệ, nếu người nhận đại diện cho một đường ống chưa được nối hoặc ổ cắm endpoint, nếu không có không gian trống còn lại trên hệ thống tập tin, hoặc nếu có khác lỗi ghi xảy ra. " - APPLE DOC

Tất cả những gì tôi muốn biết là có cách nào chúng tôi có thể xử lý hoặc xác thực những vấn đề này mà không sử dụng bất kỳ thử hoặc kiểm tra từng lỗi trong kiểm tra điều kiện trước khi viết. Bất kỳ cách nào chúng ta có thể sử dụng NSError để xử lý điều này?

Trả lời

7

Tôi sẽ nói "Không". Nếu bạn đã kiểm tra được tất cả các lỗi có thể xảy ra trước khi viết, thì không có gì để nói rằng thao tác ghi có thể thất bại sau lần kiểm tra ban đầu này (hãy nghĩ đến việc viết một hệ thống tập tin với 1KB miễn phí và bạn muốn viết 4KB).

Vì vậy, việc gói các cuộc gọi của bạn đến các phương thức này trong khối @try/@catch dường như là phương pháp tốt nhất. Những trình bao bọc này sau đó có thể trả về một NSError ** nếu bạn muốn biết chi tiết về sự thất bại (mà bạn chắc chắn nhất sẽ muốn).

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

Bạn chắc chắn sẽ muốn có được lý do cho sự thất bại vào NSError, nhưng nó không phải là ngay lập tức rõ ràng để tôi làm thế nào để đi về việc này.