【问题标题】:When will a function or method stop execution? [closed]函数或方法何时停止执行? [关闭]
【发布时间】:2016-12-22 13:18:13
【问题描述】:

这个函数在 Objective-C 中返回什么?

- (NSInteger)test1 {
    @try {
        return 1;
    } @catch (NSException *exception) {
        return 2;
    } @finally {
        return 3;
    }
    return 4;
}

函数或方法何时停止执行?(不仅是 Objective-C 代码)

------------ 更新 --------------

结果是 3。

如果我在finally中注释或删除返回码,函数会输出什么?

- (NSInteger)test2 {
    @try {
        return 1;
    } @catch (NSException *exception) {
        return 2;
    } @finally {
        //return 3;
    }
    return 4;
}

结果是 1。

我问这个问题是想知道函数什么时候会停止执行。

【问题讨论】:

  • 但你甚至没有告诉我们它是用什么语言编写的。(看起来像 Objective-C?)
  • 是的,它是 Objective-C。但在 java 中的结果相同。
  • 我不明白这个问题。您可以编译并运行该代码(使用合适的样板)并亲自查看。
  • @Avi 我当然知道答案。但我的问题不是答案。就是函数或方法的运行原理。

标签: objective-c function methods try-catch


【解决方案1】:

当它到达代码路径的最后一行时它会停止执行,所以这只是理解代码路径的问题。

一般规则:

  • 代码按其出现的顺序执行。
  • finally 块中的代码在函数返回调用者之前运行。
  • 最后一个要执行的return语句的值将是函数的返回值。

现在,让我们将这些规则应用到您的示例中。

- (NSInteger)test1 {
    @try {
        return 1;
    } @catch (NSException *exception) {
        return 2;
    } @finally {
        return 3;
    }
    return 4;
}

要执行的第一条语句是return 1;。它在@try 块中实际上是无关紧要的,因为它不会引发异常。因为是return语句,所以函数即将返回。但是,有一个 @finally 块,所以接下来执行。唯一的语句是return 3;,因此执行并替换了之前语句设置的函数的返回值。

如果您从 @finally 块中删除代码,或完全删除该块,则代码会在执行第一条语句后返回,因为它是 return 语句。

return 语句总是使函数的执行短路,并导致执行任何清理代码(例如,ObjC 中的 @finally 块,Swift 中的 defer 块)。

【讨论】:

  • 谢谢,你说得更清楚了。
【解决方案2】:

我试过你的代码。我在 viewDidLoad 方法中调用了你的编码

- (void)viewDidLoad 
{
   [super viewDidLoad];
   // Do any additional setup after loading the view, typically from a nib.
   NSInteger  i = [self test];
   NSLog(@"The value is - %ld",(long)i);
}


- (NSInteger)test {
@try 
{
    return 1;
  } @catch (NSException *exception) {
    return 2;
  } @finally {
    return 3;
  }
  return 4;
}

它会打印出来

The value is - 3

其实是先调用try块,再调用finally块。

@try — 定义一个作为异常处理域的代码块: 可能引发异常的代码。

@catch() — 定义一个包含用于处理异常的代码的块 在@try 块中抛出。 @catch 的参数是例外 本地抛出的对象;这通常是一个 NSException 对象,但可以 是其他类型的对象,例如 NSString 对象。

@finally — 定义一个相关代码块,随后 无论是否抛出异常都执行。 finally 块包含无论是否引发异常都必须执行的代码。

@throw — 抛出异常;该指令在 NSException 的 raise 方法的行为。你通常扔 NSException 对象,但不限于它们。了解更多信息 关于@throw,请参阅抛出异常。

Handling Exception

【讨论】:

  • 谢谢,但这不是我想要的答案。
  • 那你还想要什么兄弟?
  • 兄弟如果不调用finally它返回1个兄弟
  • 如果你在try块中遇到任何错误,那么它会调用catch块兄弟。
  • 但是如果你有finally块,不管发生什么都必须或者100%调用finally块兄弟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
相关资源
最近更新 更多