Osobiście używam domeny typu reverse-DNS. Na przykład:
NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];
Trzecia część domeny ( @"myproject"
) służy po prostu 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ę w konflikcie z domenami błędów innych osób (jeśli używam kodu innej firmy), chyba że ten programista celowo próbuje zadzierać tylko ze mną (co moim zdaniem byłoby bardzo mało prawdopodobne. ..).
Jeśli chodzi o konflikty numeracji kodów, nie martw się o to. Tak długo, jak kody są unikalne w domenie , wszystko powinno być w porządku.
Jeśli chodzi o tłumaczenia błędów, to zależy od Ciebie. Cokolwiek robisz, upewnij się, że dobrze to udokumentujesz. Osobiście zwykle po prostu przekazuję błędy generowane przez framework, gdy do mnie dotarły, ponieważ nigdy nie jestem do końca pewien, czy obsłużę wszystkie kody i przetłumaczę wszystkie informacje o użytkowniku na coś bardziej specyficznego dla mojego projektu. Struktury mogłyby zmieniać i dodawać więcej kodów lub zmieniać znaczenie istniejących kodów, itp. Pomaga mi to również w dokładniejszym zidentyfikowaniu źródła błędu. Na przykład, jeśli mój framework StackKit generuje błąd w com.stackkit
domenie, wiem, że jest to problem z frameworkiem. Jeśli jednak generuje błąd wNSURLErrorDomain
, to wiem, że pochodzi on konkretnie z mechanizmu ładowania adresu URL.
Co mógł zrobić, to uchwycić błąd ramową generowane i owinąć go w nowym obiekcie o błędzie, który ma swoją domenę i kod ogólny, coś kFrameworkErrorCodeUnknown
lub coś, a następnie umieścić przechwycony błąd w userInfo
ramach NSUnderlyingErrorKey
. CoreData robi to dużo (na przykład, jeśli spróbujesz , ale trzeba błędów integralności związek, dostaniesz pojedynczego błędu plecy, ale będzie zawierać znacznie więcej informacji, jak konkretnie których relacje są złe, etc).save:
NSManagedObjectContext
NSUnderlyingErrorKey
Nie mam wystarczającej liczby przedstawicieli, aby komentować, 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 swoją nazwę lub nazwę projektu, zostanie to dokładnie odzwierciedlone.źródło
NSBundle.mainBundle().bundleIdentifier!
(jeśli wiesz, że identyfikator pakietu jest ustawiony, co, jak sądzę, będzie najprawdopodobniej)Jak stworzyć niestandardowy NSError:
Najpierw utwórz słownik komunikatu o błędzie
Następnie przypisz informacje o użytkowniku do NSDictionary i gotowe.
źródło