NSAssert rzuci wyjątek, gdy nie powiedzie się. NSAssert ma więc istnieć krótki i łatwy sposób pisania i sprawdzania wszelkich założeń, które poczyniłeś w swoim kodzie. To nie jest (moim zdaniem) alternatywa dla wyjątków, tylko skrót. Jeśli asercja się nie powiedzie, oznacza to, że coś poszło nie tak w twoim kodzie i program nie powinien kontynuować.
Należy zwrócić uwagę na to, że NSAssert nie zostanie wkompilowany do twojego kodu w kompilacji wydania, więc jest to zwykle używane do sprawdzania poprawności podczas programowania. Właściwie używam niestandardowego makra assert, które jest zawsze aktywne.
Czasy, w których chciałbyś @throw
swój własny NSException, są wtedy, gdy zdecydowanie chcesz go w kompilacji wydania oraz w rzeczach, takich jak biblioteki publiczne / interfejs, gdy niektóre argumenty są nieprawidłowe lub zostałeś nieprawidłowo wywołany. Zauważ, że @catch
wyjątek nie jest standardową praktyką i kontynuuj uruchamianie aplikacji. Jeśli spróbujesz tego z niektórymi standardowymi bibliotekami Apple (na przykład Core Data), mogą się zdarzyć złe rzeczy. Podobnie jak w przypadku potwierdzenia, jeśli zostanie zgłoszony wyjątek, aplikacja powinna zasadniczo zakończyć się dość szybko, ponieważ oznacza to, że gdzieś wystąpił błąd programowania.
NSErrors powinny być używane w twoich bibliotekach / interfejsach dla błędów, które nie są błędami programowania i które można odzyskać. Możesz podać informacje / kody błędów wywołującemu, który może obsłużyć błąd, w razie potrzeby powiadomić użytkownika i kontynuować wykonywanie. Zwykle dotyczy to takich rzeczy, jak błąd nieznalezienia pliku lub inny błąd niekrytyczny.
Konwencja w kakao jest taka, że wyjątek wskazuje na błąd programisty. Wiele kodu, w tym kod frameworka, nie jest zaprojektowanych do prawidłowego działania po zgłoszeniu wyjątku.
Każdy rodzaj błędu, który powinien być naprawiony, jest reprezentowany przez plik
NSError
. Istnieje również system prezentowaniaNSError
plików użytkownikowi. Jak powiedziałeś, jest to szczególnie przydatne w przypadku omylnych zasobów zewnętrznych.Pojęciowo, twierdzenie to stwierdzenie, że dany predykat zawsze daje wynik prawdziwy; jeśli tak nie jest, program jest uszkodzony. Chociaż jego zachowanie można modyfikować,
NSAssert
rodzina jest domyślnie wygodnym sposobem rzucaniaNSInternalInconsistencyException
s (z opcją wyłączenia ich w kompilacjach wydań).źródło
Edycja: w Xcode 4.2 potwierdzenia są domyślnie wyłączone dla kompilacji wydania,
Teraz NSAssert nie zostanie wkompilowany do twojego kodu w kompilacji wydania , ale możesz to zmienić w ustawieniach kompilacji
@Mike Weller, jedna odpowiedź jest błędna.
Właściwie NSAssert zostanie wkompilowany w twój kod, jeśli nie dodasz
NS_BLOCK_ASSERTIONS
prekompilowanych plików prefiksów.W nocie technicznej TN2190 możemy znaleźć:
Lub możesz przeczytać ten: Jak sprawdzić, czy NSAssert jest wyłączony w kompilacjach wydań?
źródło
Ogólnie rzecz biorąc, wyjątki są używane do sygnalizowania błędów programisty - to rzeczy, które nie powinny się zdarzyć. Błędy są używane do sygnalizowania warunków błędów, które mogą wystąpić podczas normalnego działania programu - w zasadzie błędów użytkownika lub warunków zewnętrznych, które muszą być prawdziwe, ale mogą nie być. Zatem próba usunięcia zablokowanego elementu w dokumencie może być błędem, a próba pobrania pliku bez połączenia z Internetem byłaby błędem, ale próba uzyskania dostępu do nieprawidłowego elementu w kolekcji byłaby wyjątkiem.
Asercje są zwykle używane w testowaniu, a AFAIK nie są używane jako ogólny mechanizm obsługi błędów, jak inne.
źródło
NSParameterAssert(someParam != nil);
wymusi niezmiennik, że określony parametr nie może być zerowy.