【问题标题】:@try - catch block in Objective-C@try - Objective-C 中的 catch 块
【发布时间】:2011-03-22 18:33:49
【问题描述】:

为什么@try 块不起作用? 它使应用程序崩溃,但它应该被@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]终于
  • 可以替换 NSString* test = [NSString stringWithString:@"ss"]; with NSString* test = @"ss";

标签: iphone objective-c try-catch-finally nsexception


【解决方案1】:

Objective-C 不是 Java。在 Objective-C 中,异常就是它们的名称。例外!不要将它们用于错误处理。这不是他们的提议。 只需在使用 characterAtIndex 之前检查字符串的长度,一切都很好......

【讨论】:

  • 通常不推荐在 Objective-C 中使用 try-catch,因为它可能会破坏 ARC。
【解决方案2】:

一切都很完美:)

 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

最终条件

【讨论】:

  • 正确但有点误导 - 请记住 @finally 块在两种情况下都会执行,即无论是否抛出异常。
  • 是的,我想念这个:)
  • 请按照@Elendurwen 的说明进行修复。
【解决方案3】:

现在我发现了问题。

从我的断点中删除 obj_exception_throw 解决了这个问题。现在它被@try 块捕获,如果@try 块丢失,NSSetUncaughtExceptionHandler 将处理此问题。

【讨论】:

  • 如果在调试器中断时点击继续,您应该会看到异常被抛出并被处理程序捕获。
猜你喜欢
  • 2012-11-26
  • 2016-06-26
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多