2014-10-27 16 views
7

Xin lỗi vì đã đặt câu hỏi này. Tôi biết trong java, chúng tôi đang mở rộng lớp Exception cho các ngoại lệ tùy chỉnh. Nhưng tôi không thấy bất kỳ kịch bản nào cho mục tiêu đó c.Thực tiễn tốt để mở rộng NSError

Vì vậy, câu hỏi của tôi, Có thực tiễn tốt để mở rộng NSError và giới thiệu các lỗi tùy chỉnh không? Nếu vậy khi chúng ta nên mở rộng lớp NSError. Tôi cũng đã kiểm tra tài liệu này. Nhưng tôi không thể nhìn thấy ghi chú ghi đè cho NSError.

+5

Tôi không thấy sự cần thiết vì 'NSError' cung cấp thuộc tính miền mà bạn có thể đặt thành bất kỳ giá trị tên miền cụ thể nào. Bạn nghĩ gì khi thêm vào một lớp con 'NSError'? – trojanfoe

+1

Tôi cũng nghĩ như vậy. Nhưng hãy nói các tình huống như phơi bày thêm một số thông tin về lỗi. Có thể là một số chi tiết cụ thể về miền. – uiroshan

+4

Một lần nữa, đã được bao phủ bởi 'NSError' bằng cách thêm các mục vào từ điển' userInfo'. – trojanfoe

Trả lời

6

Tôi chưa bao giờ thấy nó được thực hiện và đó là vì NSError đã rất linh hoạt. Nó cho phép loại lỗi được xác định bằng cách đặt thuộc tính domaincode và cho phép đính kèm thông tin bổ sung tùy ý trong từ điển userInfo.

Vì vậy, không, thực hành không tốt.

+0

Để biết thêm thông tin, hãy xem [bài viết NSError] (http://nshipster.com/nserror/) của NSHipster. Cho đến nay, nơi duy nhất tôi nhìn thấy có một danh sách rất lớn các NSErrors có thể ở một nơi. –

+1

Nó là ok để phân lớp như nó được viết trong một tài liệu của Apple. – Ramis

13

Mặc dù tôi đồng ý rằng bạn không nên phân loại NSError, việc đưa các danh mục lên đó là rất hữu ích và tôi thường xuyên thực hiện việc này. Ví dụ: giả sử hệ thống của bạn thường đăng các lỗi đến từ một số khối JSON. Tôi muốn thấy nó rất thuận tiện để tạo ra một thể loại như:

@interface NSError (MyErrors) 
// Construct an NSError from data in JSON. 
// Include full JSON response in the userInfo 
+ (NSError *)myErrorWithJSON:(JSON *)json; 

// Parse the text out of the user info 
- (NSString *)myErrorMessage; 

// The full JSON error block as a string 
- (NSString *)myErrorJSON; 

// BOOLs can be helpful sometimes, or you could return an enum for use in a switch. 
- (BOOL)myIsNetworkError; 
- (BOOL)myIsAuthError; 
@end 

Tôi thường viết trợ giúp nhỏ để xây dựng hơn NSError đơn giản, xây dựng UserInfo cách tôi muốn, và các dữ liệu kéo trở lại ra khỏi UserInfo mà không gọi cần biết đại diện nội bộ của nó. Tôi thấy đây là một hình thức ẩn dữ liệu rất tốt và khuyến khích sử dụng nhiều thông điệp mô tả hơn.

Tương tự, ngay cả đối với các dự án nhỏ hơn, tôi thường tạo phương thức phân loại +myErrorWithCode:localizedDescription:. Tôi biết tên miền của mình, vì vậy tôi thường không cần phải vượt qua điều đó và điều này giúp việc đặt khóa NSLocalizedDescription dễ dàng hơn nhiều trong thông tin người dùng. Một lần nữa, điều này khuyến khích các lỗi tốt hơn bằng cách làm cho chúng dễ dàng hơn để tạo và làm cho việc thay đổi chi tiết triển khai xử lý lỗi của bạn dễ dàng hơn.

0

Không phải là một ý tưởng tồi để mở rộng NSError. Tôi cũng đã tạo một danh mục trên NSError để sử dụng riêng của mình. Tôi muốn chia sẻ nó với bạn.

(1) Tạo một file strings để xác định tất cả các mã lỗi:

/* Following are general error messgaes those we can show to user 
    regarding to Internet connection and request. You can add more 
    codes. */ 

"-1001" = "Connection time out"; 
"-1003" = "Cannot find Host"; 
"-1004" = "Cannot connect to Host"; 
"-1005" = "Server is temporarily down"; 
"-1009" = "The Internet connection appears to be offline"; 
"-1012" = "Authentication failed"; 
"2000" = "This is a custom error message"; // custom created error code 

/* Always describe unknow error with whatever you want in 
    except case (i.e. except error codes). If not mentioned 
    the following line, still you will get message "Unknown error" */ 
"Unknown error" = "Network error occured"; 

(2) Thực hiện một loại trên NSError, chúng ta hãy nói "NSError + errorInfo":

@interface NSError (ErrorInfo) 

-(NSString *)userDescription; 

@end 

(3) Xác định:

#define ERROR_KEY(code)     [NSString stringWithFormat:@"%d",code] 
#define ERROR_LOCALIZED_DESCRIPTION(code) NSLocalizedStringFromTable(ERROR_KEY(code),@"Errors",nil) 

@implementation NSError (ErrorInfo) 

-(NSString *)userDescription 
{ 
    NSString *errorDescrption = NSLocalizedStringFromTable(ERROR_KEY(self.code),@"Errors",nil); 

    if (!errorDescrption || [errorDescrption isEqual:ERROR_KEY(self.code)]){ 
     return NSLocalizedStringFromTable(@"Unknown error",@"Errors",nil);; 
    } 

    else{ 
     return ERROR_LOCALIZED_DESCRIPTION(self.code); 
    } 

    return nil; 
} 

@end 

(4) Hãy sử dụng nó:

NSError *yourError; // This can be any NSError object you get 
yourError = [NSError errorWithDomain:@"yourDomain" code:2000 userInfo:details]; // Just for test 
NSLog(@"%@",[yourError userDescription]); 
3

Trong các tài liệu được viết rằng nó là ok để lớp con:

Ứng dụng có thể chọn để tạo ra các lớp con của NSError, ví dụ , để cung cấp các chuỗi lỗi được bản địa hóa tốt hơn bằng cách ghi đè bản địa hóaMô tả.

Trong trường hợp của tôi, tôi đang làm việc với OSStatus đó là Int32. Kiến trúc NSError chỉ hỗ trợ Int. Vì vậy, tôi cần phải phân lớp nó để hỗ trợ OSSStatus.

Các vấn đề liên quan