【问题标题】:Cannot use '@try' with Objective-C exceptions disabled不能在禁用 Objective-C 异常的情况下使用“@try”
【发布时间】:2015-07-23 13:07:12
【问题描述】:

我试图在 Obj-C 中创建一个类别并使用 @try-catch,因为没有其他方法可以检查 UIStoryboard 中的标识符是否存在。

- (UIViewController *)viewControllerWithID:(NSString *)key {
    UIViewController *vc;

    @try { // ERROR: Cannot use '@try' with Objective-C exceptions disabled
        vc = [self instantiateViewControllerWithIdentifier:key];
    }
    @catch (NSException *ex) {}

    return vc;
}

不能在禁用 Objective-C 异常的情况下使用“@try”

我用谷歌搜索了那个错误,发现我必须检查Enable Objective-C Exceptions 是否在构建设置中设置为yes。我检查并设置为yes。

这是我找到的唯一解决方案,但它不起作用。

我使用 XCode 6.2,这是一个 Swift 项目,但 Swift 不支持 @try-catch,所以这就是我在 Obj-C 中这样做的原因。


当我将相同的设置设置为 no 时,我会收到一条重复的错误消息,而当我再次将其设置为 yes 时,我只会收到一条错误消息。这真的很奇怪。

【问题讨论】:

  • 您是否尝试过清理(Cmd-Shift-K)然后再次尝试构建?有时 Xcode 不会“忘记”错误,即使它们在项目被清理之前得到修复。
  • 但我没有改变任何东西
  • 这一定是xcode 6.2的bug
  • 你能解释一下为什么你需要这个类别吗?在什么情况下你会不知道你是否有一个具有特定标识符的控制器?
  • @rdelmar URL 方案等

标签: ios objective-c xcode exception try-catch


【解决方案1】:

当我将文件传输到 XCode 6.3 时,我认为这是 XCode 6.2 中的一个愚蠢错误,它不再给我这个错误。

【讨论】:

  • 你不应该以这种方式使用异常。
【解决方案2】:

你根本不应该试图捕捉这个异常。如果您尝试实例化一个不存在的视图控制器,这是一个严重的编程错误。写代码的时候你肯定知道有哪些视图控制器吧?

编辑

让我扩展一下。如果您想根据(例如)用户输入选择视图控制器,您应该验证它是否在允许的视图控制器列表中(您编写的)在尝试实例化它之前,所以您永远不会看到异常。

【讨论】:

  • 但我不想那样做。如果让vc = sb,我希望能够做到。 instanceViewControllerWithIdentifier(key) {}
  • 我不能这样做,因为苹果不支持。
  • @Arbitur 不,您编写代码来做到这一点。您在代码中包含所有允许的视图控制器标识符的列表,并检查您要使用的是否在列表中。
  • 按照我想要的方式做的错误是什么?我只想要一个 100% 故障安全解决方案,用最少的努力,我的方式是最优雅的 imo。
  • @Arbitur 你的方式一点也不优雅,这是错误的。您必须在编写代码时知道哪些标识符是有效的——毕竟您将标识符分配给每个视图控制器。为什么你不能制作一个标识符数组并测试一下是否有键?
猜你喜欢
  • 2012-05-05
  • 2020-03-08
  • 2011-08-25
  • 2014-04-12
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
相关资源
最近更新 更多