@try - Fangblock in Objective-C

193

Warum funktioniert @try block nicht? Die App stürzte ab, sollte aber vom @try-Block abgefangen werden.

 NSString* test = [NSString stringWithString:@"ss"];

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }
Alexandru Circus
quelle
Sind Sie sicher, dass es sich nicht um etwas anderes handelt, da der genaue Code, den Sie oben eingefügt haben, einwandfrei funktioniert? 2010-07-29 16: 45: 57.677 Test [93103: 207] Ausnahme: *** - [NSCFString CharacterAtIndex:]: Bereich oder Index außerhalb der Grenzen 2010-07-29 16: 45: 57.678 Test [93103: 207] endlich
mbogh
2
Sie können NSString ersetzen * test = [NSString stringWithString: @ "ss"]; mit NSString * test = @ "ss";
Duyen-Hoa

Antworten:

136

Alle funktionieren perfekt :)

 NSString *test = @"test";
 unichar a;
 int index = 5;
    
 @try {
    a = [test characterAtIndex:index];
 }
 @catch (NSException *exception) {
    NSLog(@"%@", exception.reason);
    NSLog(@"Char at index %d cannot be found", index);
    NSLog(@"Max index is: %lu", [test length] - 1);
 }
 @finally {
    NSLog(@"Finally condition");
 }

Log:

[__NSCFConstantString characterAtIndex:]: Bereich oder Index außerhalb der Grenzen

Char bei Index 5 kann nicht gefunden werden

Maximaler Index ist: 3

Endlich Zustand

iTux
quelle
8
Richtig, aber etwas irreführend - denken Sie daran, dass der @ finally-Block in BEIDEN Fällen ausgeführt wird, dh unabhängig davon, ob eine Ausnahme ausgelöst wurde oder nicht.
Elendurwen
Ja, ich vermisse das :)
iTux
Bitte korrigieren Sie wie @Elendurwen angegeben.
Sanich
78

Jetzt habe ich das Problem gefunden.

Das Entfernen von obj_exception_throwvon meinen Haltepunkten löste dieses Problem. Jetzt wird es vom @tryBlock abgefangen und wird auch NSSetUncaughtExceptionHandlerbehandelt, wenn ein @tryBlock fehlt.

Alexandru Circus
quelle
10
Wenn Sie auf Weiter klicken, wenn der Debugger unterbrochen wird, sollte die Ausnahme von Ihrem Handler ausgelöst und abgefangen werden.
JeremyP
1

Objective-C ist nicht Java. In Objective-C werden Ausnahmen so genannt. Ausnahmen! Verwenden Sie sie nicht zur Fehlerbehandlung. Es ist nicht ihr Vorschlag. Überprüfen Sie einfach die Länge der Zeichenfolge, bevor Sie characterAtIndex verwenden, und alles ist in Ordnung ....

Claus Bönnhoff
quelle
Die Verwendung von try-catch in Objective-C wird im Allgemeinen nicht empfohlen, da dies den ARC möglicherweise durcheinander bringen kann.
Langsam