@try - catch block ใน Objective-C


193

เหตุใด @try block จึงไม่ทำงาน มันทำให้แอปขัดข้อง แต่มันควรจะถูกบล็อก @try

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

 @try {
    [test characterAtIndex:6];

 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }

คุณแน่ใจหรือว่าไม่ใช่อย่างอื่นเพราะรหัสที่แน่นอนที่คุณวางไว้ด้านบนใช้งานได้ดี 2010-07-29 16: 45: 57.677 ทดสอบ [93103: 207] ข้อยกเว้น: *** - [NSCFString characterAtIndex:]: ช่วงหรือดัชนีนอกขอบเขต 2010-07-29 16: 45: 57.678 ทดสอบ [93103: 207] ในที่สุด
mbogh

2
คุณสามารถแทนที่ NSString * test = [NSString stringWithString: @ "ss"]; ด้วย NSString * test = @ "ss";
Duyen-Hoa

คำตอบ:


136

ทำงานได้อย่างสมบูรณ์แบบ :)

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

เข้าสู่ระบบ:

[__NSCFConstantString characterAtIndex:]: ช่วงหรือดัชนีไม่อยู่ในขอบเขต

ไม่พบถ่านที่ดัชนี 5

ดัชนีสูงสุดคือ: 3

ในที่สุดสภาพ


8
ถูกต้อง แต่ทำให้เข้าใจผิดเล็กน้อย - โปรดจำไว้ว่า @finally block ได้รับการดำเนินการในทั้งสองกรณีกล่าวคือไม่ว่าข้อยกเว้นจะเป็นข้อยกเว้นหรือไม่ก็ตาม
Elendurwen

ใช่ฉันคิดถึงสิ่งนี้ :)
iTux

โปรดแก้ไขตามที่ @Elendurwen บันทึกไว้
Sanich

78

ตอนนี้ฉันพบปัญหาแล้ว

การลบobj_exception_throwจุดพักจากฉันแก้ไขสิ่งนี้ ตอนนี้มันถูก@tryบล็อกและยังNSSetUncaughtExceptionHandlerจะจัดการกับมันถ้า@tryบล็อกหายไป


10
หากคุณกดปุ่มต่อไปเมื่อตัวดีบั๊กหยุดทำงานคุณควรเห็นข้อยกเว้นถูกจัดการและจัดการโดยผู้ดูแล
JeremyP

1

Objective-C ไม่ใช่ Java ในข้อยกเว้น Objective-C คือสิ่งที่ถูกเรียก ข้อยกเว้น! อย่าใช้มันสำหรับการจัดการข้อผิดพลาด มันไม่ใช่ข้อเสนอของพวกเขา เพียงตรวจสอบความยาวของสตริงก่อนใช้ characterAtIndex และทุกอย่างเรียบร้อยดี ....


โดยทั่วไปไม่แนะนำให้ใช้ try-catch ใน Objective-C เพราะอาจทำให้ ARC เกิดความสับสน
ช้า
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.