Blog Educativo.pl Menu

Link:

Obsługa wyjątków w Objective-C

w kategoriiiOS przez Educativo
Skomentuj

2Od tygodnia w katalogu Educativo dostępny jest kurs tworzenia aplikacji mobilnych na iOS. Autor kursu, Krzysztof Drypczewski, przygotował także dodatkowe zagadnienia, które nie znalazły się w kursie podstawowym iOS. Dzisiejsza notka poświęcona jest obsłudze wyjątków w języku Objective-C.

***

Błędy i radzenie sobie z nimi to chleb powszedni każdego programisty. Nie ważne jak bardzo jesteś zaawansowany, nie ważne jak często piszesz: dopóki programujesz, prędzej czy później, pojawią się błędy. Z tego powodu warto sobie zadać kilka pytań: jak sobie z nimi radzić, jak je rozpoznawać i eliminować? Wiele stron zapisano na ten temat i jeszcze więcej zostanie zapisanych więc i ja chciałbym poświęcić im parę słów.

Programiści, którzy dopiero rozpoczynają przygodę z programowaniem w Objective-C są często zdziwieni brakiem wszechobecnych w innych językach (takich jak Java i C#) bloków try – catch, chociażby takich jak na poniższym listingu.

public static void main(String args[])

{

try

{

nt num = args.length;

try

{

//zrob coś z num

}

catch(NumberFormatException n)

{

System.out.println(„NumberFormatException! „);

}

}

catch(ArrayIndexOutOfBoundsException e)

{

System.out.println(„No arguments given! „);

}

}

W przeciwieństwie do tego co mogłoby się wydawać Objective-C posiada analogiczną konstrukcję językową. Używa ona podobnych słów kluczowych poprzedzonych charakterystycznym dla tego języka znakiem @. Kod, w ramach którego może powstać wyjątek, zostaje umieszczony w bloku @try. Za obsługę ewentualnych wyjątków jest odpowiedzialny blok @catch(). Blok @finally jest wykonywany na samym końcu bez względu na to, czy napotkano jakiekolwiek problemy. Wyjątki są reprezentowane przez instancje klasy NSException. Jako przykład może posłużyć poniższy listing:

NSArray *colors = @[@”blue”, @”green”, @”red”];

int index = 13;

@try {

NSString *color = colors [index];

NSLog(@”The selected color is: %@”, color);

} @catch(NSException *ex) {

NSLog(@”An exception: %@ , %@ „, ex.name, ex.reason);

} @finally {

NSLog(@”Finally block”);

}

Dlaczego więc takie kosntrukcje są raczej rzadko spotykane? Odpowiedzi udzieli nam dokumentacja Apple.

The Cocoa frameworks are generally not exception-safe. The general pattern is that exceptions are reserved for programmer error only, and the program catching such an exception should quit soon afterwards.

źródło: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/Exceptions/Articles/ExceptionsAndCocoaFrameworks.html#//apple_ref/doc/uid/TP40009045-SW1

Z powyższego wynika, że w Objective-C przyjęto inne podejście do problemu. Wyjątki reprezentują sytuacje nadzwyczajne i nieoczekiwane, takie, po wystąpieniu których działanie programu nie powinno być kontynuowane. Blok try-catch może być używany wewnątrz danej warstwy (przykładowo: w ramach jednej biblioteki) ale jeśli otrzymamy wyjątek “z zewnątrz” powinniśmy zakończyć działanie aplikacji.

Przeciwieństwem wyjątków są “zwykłe” błędy, a więc sytuacje niechciane ale spodziewane a więc takie, do których można się przygotować. W przypadku takich problemów zalecane jest używanie obsługi błędów przy pomocy klasy NSError. O tym w kolejnej notce!

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