objective-c - 如果包含 @try @catch block ,则不带 return 语句的 Obj-C 方法可以编译

标签 objective-c compiler-errors return try-catch warnings

问题:如何让 Xcode 报告缺少的返回值?

下面是一个新的 Xcode 11 测试应用程序。我添加了带有空 @try/@catch block 且无返回值shouldReturnAnObject 方法。这样编译和分析时不会出现警告或错误。

#import "AppDelegate.h"

@interface AppDelegate ()
@property (weak) IBOutlet NSWindow *window;
@end

@implementation AppDelegate
- (nonnull id)shouldReturnAnObject {
    @try {
    } @catch (NSException *exception) {
    } @finally {
    }
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    id obj = [self shouldReturnAnObject];
    NSLog(@"obj: %@", obj);
}
@end

如果我从中删除@try block ,则无法编译并出现错误:Control到达非void函数的末尾。这是我期望任何没有返回值的方法的行为。

版本:Xcode 11.5、macOS 10.15.5。没有更改build设置。 添加 -Wall 不会改变行为。

我理解 Cocoa 的最佳实践是仅将异常用作异常。真正的应用程序很少使用异常,并且只是为了防止真正的异常行为。我提供了一个简单的测试应用程序来关注这个问题。

我相信这种行为在 Xcode/Clang 中已经存在很长时间了。如果该行为是故意的,有人可以解释为什么存在这种行为吗?whi

相关信息:我还在以下位置构建了快速测试应用程序:

  • C++ (Clang++):编译失败并出现错误 -Wreturn-type
  • Java ():编译失败,并显示错误:缺少返回语句
  • Objective-C++(使用 .mm 文件):没有警告,没有错误,编译成功

最佳答案

这是一个错误。在 https://llvm.org/PR46693 处提交了一个 LLVM 错误。

关于objective-c - 如果包含 @try @catch block ,则不带 return 语句的 Obj-C 方法可以编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62725644/

相关文章:

objective-c - 对于 NSProgress,完成处理程序是用于 UI 还是下载 Controller ?

ios - 当其 super View 上有 UITapGestureRecognizer 时,点击 URL 在 TTTAttributedLabel 中不起作用

objective-c - subview 没有收到触摸

ios - [NSConcreteValue浮点值] : unrecognized selector sent to instance

c++ - 如何通过 C++ 宏调用编译时错误?

比较两个未排序 int 数组的代码。 C

c# - 递归,返回后带有 char 数组的 C#

c++ - 为什么转换不适用于 C++ 中的自定义运算符?

c# - 为什么 C# 编译器不调用隐式转换运算符?

python - 修改函数中的变量没有结果