@ coba - tangkap blok di Objective-C

193

Mengapa @try coba blokir tidak berfungsi? Itu crash aplikasi, tapi itu seharusnya ditangkap oleh blok @try.

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

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }
Alexandru Circus
sumber
Apakah Anda yakin itu bukan sesuatu yang lain karena kode persis yang Anda tempel di atas berfungsi dengan baik. 2010-07-29 16: 45: 57.677 test [93103: 207] Pengecualian: *** - [NSCFString characterAtIndex:]: Rentang atau indeks di luar batas 2010-07-29 16: 45: 57.678 test [93103: 207] akhirnya
mbogh
2
Anda dapat mengganti NSString * test = [NSString stringWithString: @ "ss"]; dengan NSString * test = @ "ss";
Duyen-Hoa

Jawaban:

136

Semua bekerja dengan sempurna :)

 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");
 }

Catatan:

[__NSCFConstantString characterAtIndex:]: Rentang atau indeks di luar batas

Karakter pada indeks 5 tidak dapat ditemukan

Indeks maksimum adalah: 3

Akhirnya kondisi

iTux
sumber
8
Benar tetapi sedikit menyesatkan - ingat bahwa blok @ akhirnya dijalankan dalam KEDUA kasus, yaitu terlepas dari apakah pengecualian dilemparkan atau tidak.
Elendurwen
Ya, saya melewatkan ini :)
iTux
Silakan perbaiki seperti yang dicatat @Elendurwen.
Sanich
78

Sekarang saya sudah menemukan masalahnya.

Menghapus obj_exception_throwdari breakpoint saya memecahkan masalah ini. Sekarang tertangkap oleh @tryblok dan juga, NSSetUncaughtExceptionHandlerakan menangani ini jika ada @tryblok yang hilang.

Alexandru Circus
sumber
10
JIKA Anda menekan terus ketika debugger istirahat, Anda akan melihat pengecualian dilemparkan dan ditangkap oleh pawang Anda.
JeremyP
1

Objective-C bukan Java. Dalam Objective-C pengecualian adalah apa yang disebut. Pengecualian! Jangan menggunakannya untuk penanganan kesalahan. Itu bukan proposal mereka. Cukup periksa panjang string sebelum menggunakan characterAtIndex dan semuanya baik-baik saja ....

Claus Bönnhoff
sumber
Menggunakan try-catch di Objective-C umumnya tidak disarankan karena berpotensi mengacaukan ARC.
Lambat