Phương pháp hay nhất - Tên miền và mã NSError cho dự án / ứng dụng của riêng bạn


114

Có một bài đăng SO trước đó về việc thiết lập miền lỗi cho các khuôn khổ của riêng bạn, nhưng thực tiễn tốt nhất liên quan đến việc thiết lập miền lỗi và mã lỗi tùy chỉnh cho dự án / ứng dụng của riêng bạn là gì?

Ví dụ: giả sử bạn đang làm việc trên một ứng dụng chuyên sâu về Dữ liệu cốt lõi với nhiều xác thực, bạn chỉ nên sử dụng mã lỗi Dữ liệu cốt lõi "có sẵn" (chẳng hạn như NSManagedObjectValidationErrorfrom CoreDataErrors.h) hay bạn nên tự tạo MyAppErrors.hvà xác định lỗi với cụ thể hơn (tức là MyAppValidationErrorInvalidCombinationOfLimbs,?

Việc tạo một miền lỗi tùy chỉnh và tập hợp các mã lỗi có thể làm mất mã của bạn một cách đáng kể, nhưng liệu có quá nhiều chi phí để duy trì và người ta có phải lo lắng về xung đột đánh số mã lỗi không? Hay có những mối quan tâm khác ở đây?

Câu trả lời:


152

Cá nhân tôi sử dụng miền kiểu DNS ngược. Ví dụ:

NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];

Phần thứ ba của miền ( @"myproject") chỉ được sử dụng để phân biệt lỗi của dự án này ( "My Project") với lỗi trong dự án khác ( "My Other Project"=> com.davedelong.myotherproject).

Đó là một cách đơn giản để đảm bảo rằng tôi sẽ không xung đột với miền lỗi của bất kỳ ai khác (nếu tôi đang sử dụng mã của bên thứ 3), trừ khi nhà phát triển đó cố tình cố tình gây rối với chỉ tôi (điều mà tôi tin là rất khó xảy ra. ..).

Đối với xung đột đánh số mã, đừng lo lắng về điều đó. Miễn là mã là duy nhất trong một miền , bạn sẽ ổn.

Còn về lỗi dịch thì tùy bạn. Dù bạn làm gì, hãy đảm bảo rằng bạn ghi chép nó tốt. Cá nhân tôi thường chỉ chuyển các lỗi do khuôn khổ tạo ra khi chúng đến với tôi, vì tôi không bao giờ chắc chắn rằng tôi sẽ xử lý tất cả các mã và dịch tất cả userInfo thành một cái gì đó cụ thể hơn cho dự án của tôi. Các khuôn khổ có thể thay đổi và thêm nhiều mã hoặc thay đổi ý nghĩa của các mã hiện có, v.v. Nó cũng giúp tôi xác định cụ thể hơn lỗi đến từ đâu. Ví dụ: nếu khuôn khổ StackKit của tôi tạo ra lỗi trong com.stackkitmiền, tôi biết rằng đó là sự cố khung. Tuy nhiên, nếu nó tạo ra lỗi trong NSURLErrorDomain, thì tôi biết rằng nó đặc biệt đến từ cơ chế tải URL.

Những gì bạn có thể làm là nắm bắt lỗi do khung công tác tạo ra và bọc nó trong một đối tượng lỗi mới có tên miền của bạn và mã chung, một cái gì đó tương tự kFrameworkErrorCodeUnknownhoặc một cái gì đó, rồi đặt lỗi đã bắt vào bên userInfodưới NSUnderlyingErrorKey. CoreData thực hiện điều này rất nhiều (ví dụ, nếu bạn cố gắng save:một NSManagedObjectContext, nhưng bạn phải lỗi vẹn mối quan hệ, bạn sẽ nhận được một lỗi lại duy nhất, nhưng NSUnderlyingErrorKeysẽ chứa nhiều thông tin hơn, giống như đặc biệt mà các mối quan hệ là sai, vv).


Vì apple cũng sử dụng DNS ngược nên những người khác cũng có thể sử dụng kiểu này.
Johan Karlsson

36

Tôi không có đủ đại diện để bình luận, nhưng đối với câu trả lời được chấp nhận bởi Dave DeLong, có thể tốt hơn một chút nếu sử dụng [[NSBundle mainBundle] bundleIdentifier]thay thế @"com.myName.myProject". Bằng cách này, nếu bạn thay đổi tên của bạn hoặc tên của dự án, nó sẽ được phản ánh chính xác.


4
Ý tưởng tốt. Nếu bạn đang sử dụng Swift, bạn nên sử dụng tùy chọn không được bao bọc: NSBundle.mainBundle().bundleIdentifier!(nếu bạn biết số nhận dạng gói đã được đặt, tôi đoán sẽ có nhiều khả năng)
Juul

Tại sao bạn muốn phản ánh các thay đổi tên dự án trong miền lỗi?
zrslv

1
@zrxq Chắc chắn là có giá trị khi có các miền lỗi khác nhau, nhưng hãy tưởng tượng bạn viết sai chính tả cho dự án của mình hoặc bạn đã đổi tên mà bạn muốn nó phản ánh ở khắp mọi nơi. Tốt hơn nên đặt nó động hơn là mã hóa cứng.
Connor

1
@vare Rõ ràng là vậy, tôi không thực sự hiểu những lợi ích thiết thực mà nó mang lại. Tôi hiểu là những số nhận dạng đó chỉ cần là duy nhất trong ngữ cảnh của ứng dụng, vậy thôi. Được rồi, có lẽ bạn chỉ muốn chúng đẹp hơn về mặt thẩm mỹ, tôi hiểu rồi!
zrslv

1
Vâng, bạn đưa ra một điểm tốt. Đôi khi bạn muốn miền là duy nhất, tôi sẽ giả sử ... chẳng hạn như có lẽ nếu bạn đang tạo SDK hoặc (cacao) Pod, bạn sẽ muốn miền lỗi của mình phản ánh nguồn gốc của nó chứ không phải của dự án Tên. CHỈNH SỬA: Tôi cũng (trong câu trả lời của mình) muốn chỉ ra rằng @ "com.myName.myProject" giống hệt với BundIdentifier trong trường hợp này mà mọi người có thể không biết.
Connor

4

Cách tạo NSError tùy chỉnh:

Đầu tiên hãy tạo một Từ điển của thông báo lỗi

NSDictionary *userInfo = @{   
   NSLocalizedDescriptionKey: NSLocalizedString(@"Unknown Error - Please try again", nil),
   NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil),
   NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Unknown Error - Please try again", nil)
                                               };
NSError *error = [NSError errorWithDomain:[[NSBundle mainBundle] bundleIdentifier] 
  code:-58 userInfo:userInfo];

Sau đó, gán userInfo cho NSDictionary là xong.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.