En İyi Uygulama - Kendi projeniz / uygulamanız için NSError alanları ve kodları


114

Orada bir olan önceki SO sonrası kendi çerçeveler için hata etki kurma konusunda, ancak hata etki ve özel hata kodlarını kurma konusunda en iyi uygulama nedir kendi proje / uygulama için ?

Örneğin, sadece (örneğin, "kullanıma hazır" Çekirdek Veri hata kodları ile sopa olmalıdır, doğrulamaları dolu bir çekirdek Veri yoğun uygulaması üzerinde Sen çalışma varsayarsak NSManagedObjectValidationErroritibaren CoreDataErrors.h) veya kendi oluşturmalıdır MyAppErrors.hve hataları tanımlamak daha özgüllük (yani MyAppValidationErrorInvalidCombinationOfLimbs?

Özel bir hata alanı ve bir dizi hata kodu oluşturmak, kodunuzun belirsizliğini önemli ölçüde ortadan kaldırabilir, ancak bu, sürdürülmesi gereken çok fazla ek yük mü ve hata kodu numaralandırma çakışmaları konusunda endişelenmek mi gerekiyor? Yoksa burada başka endişeler var mı?

Yanıtlar:


152

Kişisel olarak ters DNS tarzı bir etki alanı kullanıyorum. Örneğin:

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

Alanın üçüncü kısmı ( @"myproject") sadece bu projedeki ( "My Project") hataları başka bir projedeki ( "My Other Project"=> com.davedelong.myotherproject) hatalardan ayırt etmek için kullanılır .

Bu, geliştiricinin kasıtlı olarak sadece benimle uğraşmaya çalışmadığı sürece (ki bunun pek olası olmadığına inanıyorum. ..).

Kod numaralandırma çakışmalarına gelince, bunun için endişelenmeyin. Kodlar bir etki alanında benzersiz olduğu sürece , iyi olmalısınız.

Çeviri hataları ise size kalmış. Ne yaparsan yap, iyi belgelediğinden emin ol. Kişisel olarak , genellikle bana geldiklerinde çerçeve tarafından üretilen hataları aktarıyorum, çünkü tüm kodları ele alacağımdan ve tüm kullanıcı bilgisini projeme daha özel bir şeye çevireceğimden asla tam olarak emin değilim. Çerçeveler değiştirebilir ve daha fazla kod ekleyebilir veya mevcut kodların anlamını değiştirebilir, vb. Ayrıca hatanın nereden geldiğini daha net bir şekilde belirlememe yardımcı olur. Örneğin, StackKit çerçevem com.stackkitetki alanında bir hata oluşturuyorsa bunun bir çerçeve sorunu olduğunu biliyorum. Ancak, içinde bir hata oluşturuyorsa NSURLErrorDomain, bunun özellikle URL yükleme mekanizmasından geldiğini biliyorum.

Ne olabilir yapmak çerçeve oluşturulmuş hatayı yakalamak ve alanınızı ve genel bir kod gibi bir şey sahip yeni hata nesnesinde sar olduğu kFrameworkErrorCodeUnknownya da bir şey ve sonra yakalanan hatayı yerleştirmek userInfoaltında NSUnderlyingErrorKey. CoreData bu çok (eğer denerseniz, örneğin yapar save:bir NSManagedObjectContextama ilişki bütünlüğü hataları var, bir tek hata geri alırsınız, ama NSUnderlyingErrorKeyözellikle ilişkiler yanlış olduğu gibi çok daha fazla bilgi, vb içerecektir).


Apple da ters DNS kullandığından, diğerlerinin de bu stili kullanması uygun görünmektedir.
Johan Karlsson

36

Yorum yapacak yeterli sayım yok, ancak Dave DeLong tarafından kabul edilen cevap [[NSBundle mainBundle] bundleIdentifier]yerine kullanmak biraz daha iyi olabilir @"com.myName.myProject". Bu şekilde isminizi veya projenizin adını değiştirirseniz doğru bir şekilde yansıtılacaktır.


4
İyi bir fikir. Eğer Swift kullanıyorsanız, size Çizelgesi opsiyonel kullanmalısınız: NSBundle.mainBundle().bundleIdentifier!(ben büyük olasılıkla olacak sanırım, hangi paket tanıtıcısı ayarlanırsa biliyorsanız)
Juul

Hata etki alanındaki proje adı değişikliklerini neden yansıtmak istersiniz?
zrslv

1
@zrxq Elbette farklı hata alanlarına sahip olmanın değeri vardır, ancak projenizi yanlış yazdığınızı veya isminizi değiştirdiğinizi ve her yere yansıtılmasını istediğinizi hayal edin. Sabit kodlamaktansa dinamik olarak ayarlanmış olması daha iyi.
Connor

1
@vare Bu kadar açık, bunun ne gibi pratik faydalar sağlayacağını gerçekten anlamıyorum. Anladığım kadarıyla, bu tanımlayıcıların sadece uygulama bağlamında benzersiz olması gerekiyor, hepsi bu. Tamam, belki de estetik olarak daha hoş olmalarını istiyorsun, anladım!
zrslv

1
Evet, iyi bir noktaya değindin. Alanın benzersiz olmasını istediğiniz zamanlar vardır, varsayıyorum ... örneğin bir SDK veya (kakao) Kapsül oluşturuyorsanız, hata alanınızın projenin geldiği yeri değil, nereden geldiğini yansıtmasını istersiniz. adlandırın. DÜZENLEME: Ben de (cevabımda) @ "com.myName.myProject" ifadesinin bu durumda bundleIdentifier ile özdeş olduğunu belirtmek istedim, insanlar bunu bilmiyor olabilir.
Connor

4

Özel bir NSError nasıl oluşturulur:

Önce hata mesajının sözlüğünü oluşturun

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];

Ardından, kullanıcı bilgisini NSDictionary atayın ve tamamlayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.