IPhone/Objective-C Praktyka obsługi wyjątków typu Try-catch


Przepraszam, jeśli gdzie indziej już udzielono odpowiedzi na to pytanie, ale nie mogłem znaleźć rozstrzygającej odpowiedzi podczas wyszukiwania:
Zastanawiam się, kiedy bloki try-catch będą używane w aplikacjach z obiektywem do iPhone'a. We wprowadzeniu firmy Apple do języka programowania Objective-C stwierdza się, że wyjątki wymagają dużej ilości zasobów i „wyjątków nie należy używać do ogólnej kontroli przepływu ani po prostu do wskazywania błędów”. Po przeczytaniu kilku powiązanych pytań zdałem sobie również sprawę, że ludzie rzadko używają tej metody w praktyce.
Więc myślę, że pytanie brzmi, jakie są sytuacje, w których należy używać bloków try-catch podczas tworzenia programów na iPhone/Objective-C i kiedy absolutnie NIE należy ich używać?
Na przykład mógłbym ich użyć do wyłapania poza granicami i innych wyjątków podczas pracy z obiektami w tablicach. Mam metodę, która wykonuje wiele zadań z obiektami, które są przekazywane w wielu tablicach. Metoda zwraca zero, jeśli wystąpił błąd, a blok try-catch może pomóc mi złapać wyjątki. Jednak mógłbym oczywiście po prostu napisać małe testy tu i tam, aby upewnić się, że na przykład nigdy nie próbuję uzyskać dostępu do indeksu poza tablicami. Co byś zrobił w tej sytuacji?
Wielkie dzięki!
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

@ Try/@ catch można używać tylko do obsługi błędów krytycznych. Nigdy nie powinieneś używać @ throw/@ try/@ catch do wykonywania operacji typu flow.
W szczególności niepraktyczne byłoby używanie poza boiskiem do wychwytywania wyjątków, chyba że celem jest ich wyłapanie i zgłoszenie błędu w jakiś sposób, a następnie - zwykle - awaria, a przynajmniej ostrzeżenie użytkownika, że ​​Twoja aplikacja jest w niespójnym stanie i może utracić dane.
Zachowanie każdego wyjątku zgłoszonego przez kod struktury systemu jest niezdefiniowane.
Twój test if do sprawdzania granic jest dużo bardziej odpowiednim rozwiązaniem.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Odpowiedź @ bbum jest absolutnie poprawna (a on znałby odpowiedź lepiej niż większość). Trochę więcej szczegółów ...
W kakao należy generalnie unikać używania wyjątków (
@ try/@ catch [/ @ w końcu]
) do kontrolowania przepływu. Jak wspomniałeś, wyjątki są niezwykle kosztowne (w porównaniu do środowisk wykonawczych, takich jak JVM lub CLR, które są zoptymalizowane pod kątem korzystania z wyjątków). Ponadto większość frameworków Cocoa nie jest wyjątkowo bezpieczna. W związku z tym przerzucenie wyjątku przez kod struktury Cocoa jest niebezpieczne i najprawdopodobniej spowoduje dziwne, trudne do zdiagnozowania i katastrofalne (pomyśl o utracie danych) błędy w aplikacji.
Zamiast używać wyjątków, kod Cocoa używa
NSError
do sygnalizowania błędów, które mogą

być przywróconym

w aplikacji. Wyjątki służą do sygnalizowania warunków, z których nie pochodzi Twoja aplikacja

mogą

wyzdrowieć. W związku z tym składnik interfejsu użytkownika żądający pozycji poza zakresem w tablicy modelu może zostać zasygnalizowany błędem (przedstawionym użytkownikowi wraz ze wskazaniem powodu, dla którego jego żądanie nie może zostać zakończone) podczas próby uzyskania dostępu do obszaru poza zakresem pozycja z podanym indeksem, który Twoim zdaniem powinien być prawidłowy, sygnalizuje wyjątkowy stan, gdy aplikacja jest w stanie niespójnym i prawdopodobnie powinna umrzeć tak szybko, jak to możliwe, zanim będzie mogła wyrządzić więcej szkód.
Na przykład
NSParameterAssert
sygnalizuje za pomocą
NSException
, że asercja nie powiedzie się.
Więc kiedy ty

powinien

użyć wyjątków lub
@ try/@ catch
? Jeśli używasz biblioteki C/C ++, która używa wyjątków, musisz przechwycić te wyjątki, zanim będą mogły zostać odrzucone z powrotem przez kod Cocoa. Podobnie, jeśli poważnie myślisz o spójności stanu w swoim wniosku, to ty

powinien

wyrzuć wyjątek, gdy tylko stwierdzisz, że twój stan jest niespójny (i nieodwracalny).

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się