2010-09-10 7 views
0
int main (int argc, const char * argv[]) { <br> 

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

int a1,b1,c1; 
@try {  
    NSLog(@"Enter numerator: "); 
    scanf("%i",&a1); 
    NSLog(@"Enter denomenator: "); 
    scanf("%i",&b1); 
    c1 = a1/b1; 
    NSLog(@"%i",c1); 
} 
@catch (NSException * e) { 
    NSLog([e name]); 
    NSLog([e description]); 
    NSLog([e reason]); 
} 
@finally { 
    NSLog(@"inside finally block"); 
} 
[pool drain]; 

return 0; 

} 

Ici, si j'entre la valeur de a1 = 10, b1 = 0, alors il devrait y avoir une exception générée, donc l'instruction dans le bloc catch sera supposée être exécutée. Mais ce n'est pas le cas. Le programme s'est écrasé. Try..Catch ne fonctionne pas dans ce cas ...... On dirait que je fais quelque chose de mal ...try ... catch ne fonctionne pas

+0

Il montre Programme signal reçu: « EXC_ARITHMETIC », mais les déclarations de captures n'exécute pas du tout. – Matrix

+0

Objective-C n'est pas Java. Toutes les erreurs signalées ne sont pas des exceptions. En fait, les exceptions sont une sorte de, euh, d'exception. –

Répondre

1

Vous voyez l'exception de virgule flottante provoquée par le code C (c1 = a1/b1). Ceci n'est pas enveloppé dans une exception NSException.

Si vous voulez passer par le bloc catch, vous pouvez remplacer votre code FPE avec

[[NSString string] setValue:@"" forKeyPath:@"KP"]; 

qui déclenchera une NSUnknownKeyException.

3

try/catch ne fonctionnera que pour les exceptions Obj-C qui sont lancées. Ce sont des constructions de très haut niveau. Ceci est probablement différent des blocs try/catch de Java, qui vous permettent d'attraper presque tout.

+0

Pas presque. Tout :) Toutes les exceptions sont des sous-classes de Throwable. http://docs.oracle.com/javase/7/docs/api/java/lang/Throwable.html IMO, sauf s'il s'agit d'une erreur de mémoire insuffisante ou de cpu élevée, elle peut être interceptée. –

1

Il semble que l'OP souhaite juste un exemple de try-catch-finally. Juste au cas où quelqu'un d'autre a besoin est, voici un exemple de base est de travailler avec ARC:

#import <Foundation/Foundation.h> 

int main (int argc, char *argv[]) { 
    @autoreleasepool { 
     @try { 
      @throw ([NSException exceptionWithName:@"MyException" 
              reason:@"Just testing" 
              userInfo:nil]); 
     } 
     @catch (NSException *ex) { 
      NSLog(@"Exception caught: %@", ex); 
     } 
     @finally { 
      NSLog(@"Finally is executed whether there's an exception or not"); 
     } 
    } 
    return 0; 
}