2014-10-27 19 views
7

ürününü uzatmak iyi bir uygulamadır. Bu soru sorduğum için üzgünüz. Java'da biliyorum ki özel istisnalar için Exception sınıfını genişletiyoruz. Ancak, objektif olarak bunun için herhangi bir senaryo görmüyorum c.NSError

Benim soru, bu NSError ve tanıtan özel hatalarını uzatmak için iyi bir uygulama mı? Eğer öyleyse NSError sınıfını genişletmeliyiz. Bunun için de belgeleri kontrol ettim. Ancak NSError için geçersiz notları göremiyorum.

+5

"NSError", alana özgü değeri ne olursa olsun belirleyebileceğiniz bir etki alanı özelliği sağlama gereğini görmüyorum. Bir 'NSError' alt sınıfı ile eklemeyi ne kadar değer düşünüyorsunuz? – trojanfoe

+1

Aynı şeyi düşünüyordum da. Ancak, hata hakkında daha fazla bilgi açığa çıkarmak gibi senaryolar söyleyelim. Bazı alana özel ayrıntılar olabilir. – uiroshan

+4

Yine, "userInfo" sözlüğüne girdiler ekleyerek "NSError" tarafından kapsanmıştır. – trojanfoe

cevap

6

Ben yapıldığını ve NSError zaten çok yönlüdür nedeni de görmedim. domain ve code özelliklerini ayarlayarak hata türünün tanımlanmasını sağlar ve userInfo sözlüğünde isteğe bağlı ek bilgilerin eklenmesini sağlar.

Yani, hayır, iyi bir uygulama değil. Sana NSError alt sınıf gerektiğini kabul ederken

+0

Daha fazla bilgi için NSHipster'ın [NSError article] (http://nshipster.com/nserror/) adresini ziyaret edin. Şimdiye kadar gördüğüm tek yer, muhtemel NSError'ların tek bir yerinde büyük bir listesine sahip. –

+1

Bir Apple belgesinde yazıldığı gibi alt sınıfa tamamdır. – Ramis

13

, üzerinde kategoriler koymak için çok faydalı olduğunu ve düzenli olarak yapıyoruz. Örneğin, sisteminizin sık sık bazı JSON bloklarından gelen hataları gönderdiği söyleyin. Ben böyle bir kategori oluşturmak için çok uygun bulacağını: basitçe NSError daha inşa istediğim şekilde userinfo inşa etmek

@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 

Sık sık yazmak küçük yardımcıları ve çekme verileri geri UserInfo dışına arayanlar olmadan içsel temsilini bilmeye ihtiyaç duyuyor. Bunu çok iyi bir veri gizleme biçimi olarak görüyorum ve daha açıklayıcı mesajların kullanımını teşvik ediyor.

Benzer şekilde, daha küçük projeler için, sık sık bir +myErrorWithCode:localizedDescription: kategori yöntemini oluşturur. Alanımı biliyorum, bu yüzden genellikle bunu geçmem gerekiyor ve bu, NSLocalizedDescription anahtarını kullanıcı bilgisine ayarlamak için çok daha kolay. Yine, bu, daha kolay hatalar yaratmayı kolaylaştırır ve hata işleminizin uygulama ayrıntılarını değiştirmeyi kolaylaştırır.

0

O NSError uzatmak için kötü bir fikir değil. Ayrıca kendi kullanımım için NSError'da bir kategori hazırladım. Bunu seninle paylaşmak istiyorum.

/* 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), NSError bir kategori yap "NSError + errorInfo" diyelim:

(1) bir strings dosya tüm hata kodlarını tanımlamak olun

@interface NSError (ErrorInfo) 

-(NSString *)userDescription; 

@end 

(3) bunu tanımlayın:

Bunun

(4) Marka kullanım:

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

Belgelemede, alt sınıfa ok olduğunu yazılır:

örneğin NSError alt sınıflarını oluşturmayı tercih edebilir

Uygulamalar localizedDescription öğesini geçersiz kılarak daha iyi yerelleştirilmiş hata dizeleri sağlamak için .Benim durumumda

Ben Int32 olduğunu OSStatus ile çalışıyorum. NSError kurucusu yalnızca Int'u destekler. Bu yüzden OSSStatus'u desteklemek için alt sınıflara ihtiyacım var.