2012-12-08 13 views
9

Dostaję awarię aplikacji w main.m w mojej aplikacji i nie mam pojęcia, dlaczego wystąpił błąd, ponieważ xcode nie pokazuje mi miejsca wystąpienia awarii, pokazuje mi, że awarie przy powrocie UIApplicationMain (argc, argv ...), który nic mi nie mówi.Ekwiwalent Try-Catch w Objective-C

Czy istnieje sposób na uzyskanie w Objective-C odpowiednika próby/catch w C++, aby zobaczyć, gdzie dokładnie wystąpił błąd?

+2

Sprawdź odpowiedź na [to pytanie] (http://stackoverflow.com/questions/8100054/no-exception-stack-trace-in-console-under-xcode-4-2-ios- 5). –

+0

Dziękuję bardzo. To rozwiązało mój problem. Problemem była nazwa metody selektora i wielkie litery U, a rzeczywista metoda miała małe litery u. Kompilator nie złapał tego (zły, zły), ale rozwiązanie w linku dało mi dokładnie to, na czym polegał problem. dzięki jeszcze raz. –

Odpowiedz

8

enter image description here enter image description here

dałem składni try catch poniżej, ale oprócz tego, co można zrobić, jest to, że w Xcode, można ustawić punkty przerwania. Po lewej stronie eksploratora projektu kliknij kartę Punkty przerwania. W lewym dolnym rogu znajdziesz znak +. (zdjęcia powyżej) Kliknij na to i dostaniesz opcję ustawienia wyjątku breakpoint. To, co to zrobi, to to, że zatrzyma się na dowolnej linii, na której nastąpiła awaria. Tam nie trzeba ustawiać instrukcji catch gdziekolwiek.

@try { 

    // Your statements here 
} 
@catch (NSException * e) { 
    NSLog(@"Exception: %@", e); 
} 
@finally { 
    NSLog(@"finally"); 
} 
+1

Patrz wyżej - dodaj 'NSLog (@" Stack trace:% @ ", [e callStackSymbols]);' –

13

Chociaż Objective-C nie mają @try/@catch, nie pomoże Ci wiele. Zanim przejdziesz do @catch, ramka stosu, w której wystąpił błąd, zniknie.

Co trzeba to ustawić punkt przerwania że przerwy na wyjątek: otwórz Breakpoint Navigator stronę (drugi przycisk od prawej), a następnie kliknij przycisk [+] na dole strony nawigatora. Wybierz "Dodaj wyjątek przerwania ...", a następnie kliknij [Gotowe].

Teraz program będzie łamał się w debugerze za każdym razem, gdy twój program zgłasza wyjątek.

+0

OK, próbowałem tego. +1 za bardzo dobre instrukcje. Problem polega na tym, że zatrzymuje się ponownie w tym samym miejscu w int main (int argc, char * argv []). Śledzenie stosu jest w języku asemblerowym, nie mam pojęcia, jak odczytać wyjątek. Jakieś inne szczegóły, które przeoczyłem? –

+2

Dodaj to do swojego '@ catch':' NSLog (@ "Stack trace:% @", [wyjątek callStackSymbols]); ' –

+0

@HotLicks Dzięki za komentarz i świetny link, który napisałeś powyżej! – dasblinkenlight

3
//////////////////////ADVANCED TRY CATCH SYSTEM//////////////////////////////////////// 
    #ifndef UseTryCatch 
    #define UseTryCatch 1 
    #ifndef UsePTMName 
    #define UsePTMName 0 //USE 0 TO DISABLE AND 1 TO ENABLE PRINTING OF METHOD NAMES WHERE EVER TRY CATCH IS USED 
    #if UseTryCatch 
    #if UsePTMName 
    #define TCSTART @try{NSLog(@"\n%s\n",__PRETTY_FUNCTION__); 
    #else 
    #define TCSTART @try{ 
    #endif 
    #define TCEND }@catch(NSException *e){NSLog(@"\n\n\n\n\n\n\ 
    \n\n|EXCEPTION FOUND HERE...PLEASE DO NOT IGNORE\ 
    \n\n|FILE NAME   %s\ 
    \n\n|LINE NUMBER  %d\ 
    \n\n|METHOD NAME  %s\ 
    \n\n|EXCEPTION REASON %@\ 
    \n\n\n\n\n\n\n",strrchr(__FILE__,'/'),__LINE__, __PRETTY_FUNCTION__,e);}; 
    #else 
    #define TCSTART { 
    #define TCEND } 
    #endif 
    #endif 
    #endif 
    //////////////////////ADVANCED TRY CATCH SYSTEM//////////////////////////////////////// 






Use TRY CATCH IN ANY METHOD LIKE THIS 


-(void)anyMethodThatCanGenerateException 
{ 
    TCSTART 


    TCEND 
}