Blog Educativo.pl Menu

Link:

Obsługa błędów w Objective-C

w kategoriiiOS przez Educativo
Skomentuj

2Programując dla iOS zdarzają się sytuacje, kiedy pojawiają się błędy programu. Krzysztof Drypczewski, autor kursu „iOS od podstaw”, w prosty sposób radzi, jak z takimi błędami w Objective-C najlepiej sobie poradzić. 

***

W poprzednim wpisie wspomniałem o bloku try-catch. W Objective-C nie powinno się używać tej konstrukcji do przerywania wykonywania programu w przypadku wystąpienia błędu, którego, mówiąc kolokwialnie, “możemy się spodziewać”. Powstaje, więc pytanie: co, jeśli nie try-catch?

W Objective-C używa się w tym celu obiektu typu NSError. Metody, w których występują błędy przyjmują zwykle argument, który jest referencją do obiektu NSError. Jeśli wystąpi błąd, metoda zwraca nil lub NO i wypełnia obiekt błędu odpowiednimi informacjami. Jeśli nie pojawią się żadne problemy, wynik jest zwracany w normalny sposób.

Metody są często napisane tak, że mogą przyjąć jako parametr pośrednią referencję (ang. indirect reference) do NSError. Pośrednia referencja to wskaźnik na wskaźnik – takie rozwiązanie umożliwia metodzie ustawienie argumentu tak, aby wskazywał na nową instancję błędu. Metody tego typu można rozpoznać w ten sposób, że przyjmują jako parametr (NSError **)error (dwie gwiazdki symbolizują wskaźnik na wskaźnik).

Sprawdźmy na przykładzie, jak używa się pośredniej referencji do obsługi błędów. W poniższej metodzie znajduje się warunek sprawdzający wystąpienie błędu, jeśli się on pojawi parametr error zostanie zainicjalizowany informacjami dotyczącymi napotkanego problemu.

– (id)errorMethod:(NSString*)str error:(NSError**)error

{

//ciało metody, gdzie może pojawić się błąd

if (YES) //sprawdzenie czy wystąpił błąd

{

//nie jest dobrze!

NSMutableDictionary *opisBledu = [NSMutableDictionary dictionary];

[opisBledu setValue:@”Wystapił błąd” forKey:NSLocalizedDescriptionKey];

*error = [NSError errorWithDomain:@”myDomain” code:100 userInfo:opisBledu];

return nil;

}

//koniec działania metody, zwróć wynik

return return @”koniec”;

}

Następnie, możemy wywołać powyższą metodę jako parametr przekazując wskaźnik na wskaźnik na obiekt typu NSError, tak jak prezentuje to poniższy listing. Zwróć uwagę, że obiekt error nie został zainicjalizowany przed wywołaniem errorMethod, więc warunek if (error) zostanie spełniony tylko wtedy, jeśli w ramach metody napotkany zostanie błąd. Operator & to tzw. operator pobrania adresu.

NSError *error = nil;

id ret = [self errorMethod:@”parametr” error:&error];

if (error) //sprawdzamy czy w czasie wykonywania errorMethod wystąpił błąd

{

//reagujemy na błąd

NSLog(@”Opis błędu: %@”,[error localizedDescription] );

return;

}

NSLog(@”Wynik dziłania metody: %@”, ret);

Powyższy przykład pokazuje w uproszczony sposób jak używać pośredniej referencji na NSError. Zważywszy na fakt, że używanie bloków try – catch w sytuacji, w której nie posiadamy odśmiecania pamięci, może stanowić nie lada wyzwanie, jest to przyjemna i prosta w obsłudze technika.

  • Dziękujemy za skomenentowanie, dozwolone znaczniki html to strong, code i href.