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?

Author: Community, 2010-07-18

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.).

 143
Author: Dave DeLong,
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.

 31
Author: Connor,
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.

 2
Author: Mike Zriel,
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