Najlepsze praktyki-domeny i kody NSError dla własnego projektu/aplikacji
Istnieje poprzedni post so dotyczący konfigurowania domen błędów dla własnych frameworków, ale jaka jest najlepsza praktyka w zakresie konfigurowania domen błędów i niestandardowych kodów błędów dla własnego projektu/aplikacji?
Na przykład, przypuśćmy, że pracujesz nad podstawową aplikacją z dużą ilością walidacji, powinieneś trzymać się" z półki " kodów błędów podstawowych danych (takich jak NSManagedObjectValidationError
z CoreDataErrors.h
) lub powinieneś utworzyć własne MyAppErrors.h
i definiować błędy za pomocą więcej specyficzność (tj. MyAppValidationErrorInvalidCombinationOfLimbs
?
Utworzenie niestandardowej domeny błędów i zestawu kodów błędów może znacznie rozdzielić kod, ale czy utrzymanie go jest zbyt duże i czy trzeba się martwić konfliktami numeracji kodów błędów? Czy są tu jakieś inne obawy?
3 answers
Osobiście używam domeny w stylu odwrotnego DNS. Na przykład:
NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];
Trzecia część domeny (@"myproject"
) jest po prostu używana do odróżnienia błędów z tego projektu ("My Project"
) od błędów w innym projekcie ("My Other Project"
=> com.davedelong.myotherproject
).
Jest to prosty sposób, aby upewnić się, że nie będę kolidować z cudzymi domenami błędów (Jeśli używam kodu strony trzeciej), chyba że programista celowo próbuje zadzierać z tylko mną (co moim zdaniem byłoby wysoce mało prawdopodobne...).
Jeśli chodzi o konflikty numeracji kodów, nie przejmuj się tym. Tak długo, jak kody są unikalne w obrębie domeny , powinno być OK.
Jeśli chodzi o tłumaczenie błędów, to zależy od Ciebie. Cokolwiek zrobisz, upewnij się, że dobrze to udokumentujesz. osobiście , zwykle po prostu przekazuję błędy generowane przez framework, ponieważ nigdy nie jestem pewien, czy zajmę się wszystkimi kodami i przetłumaczę wszystkie informacje o userInfo na coś bardziej specyficznego dla mojego projekt. Frameworki mogą się zmieniać i dodawać więcej kodów, lub zmieniać znaczenie istniejących kodów itp. Pomaga mi to również dokładniej określić, skąd wziął się błąd. Na przykład, jeśli mój StackKit framework generuje błąd w domenie com.stackkit
, wiem, że jest to problem z frameworkiem. Jeśli jednak generuje błąd w NSURLErrorDomain
, to Wiem, że konkretnie pochodzi z mechanizmu ładowania URL.
To, co ty mógłbyś zrobić, to uchwycić framework wygenerowany błąd i zawiń go w nowy obiekt błędu, który ma Twoją domenę i Kod ogólny, coś w stylu kFrameworkErrorCodeUnknown
lub coś takiego, a następnie umieść przechwycony błąd w userInfo
Pod NSUnderlyingErrorKey
. CoreData robi to często (na przykład, jeśli spróbujesz save:
an NSManagedObjectContext
, ale masz błędy integralności relacji, otrzymasz pojedynczy błąd z powrotem, ale NSUnderlyingErrorKey
będzie zawierał znacznie więcej informacji, na przykład, które relacje są złe itp.).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-18 16:50:50
Nie mam wystarczająco rep, aby skomentować, ale dla zaakceptowanej odpowiedzi Dave ' a Delonga, może być nieco lepiej użyć [[NSBundle mainBundle] bundleIdentifier]
zamiast @"com.myName.myProject"
. W ten sposób, jeśli zmienisz nazwę lub nazwę projektu, zostanie ona dokładnie odzwierciedlona.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-28 23:18:31
Jak utworzyć niestandardowy NSError:
Utwórz Słownik Komunikatu o błędzie
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:@"com.yourdomain.bundleidentifier"
code:-58 userInfo:userInfo];
Następnie przypisz userInfo do NSDictionary i gotowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 07:52:20