【问题标题】:iphone: try end tryiphone:尝试结束尝试
【发布时间】:2011-03-23 15:55:57
【问题描述】:

Objective-C 中是否有任何方法可以查看是否可以在不冒应用程序崩溃风险的情况下执行特定任务?

其他语言如 javascript 有

try
  {
  //Run some code here
  }
catch(err)
  {
  //Handle errors here
  }

Objective-C 中有什么东西吗? 如果有,语法是什么?

谢谢。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    虽然 Felix 的回答在技术上是正确的,但并不是全部。

    在 iOS 和 Mac OS X 上,异常用于指示不可恢复的程序错误。异常不用于指示用户错误或 Java 等可恢复错误。

    任何通过系统框架代码的异常都会使所述框架处于未定义状态。。捕获上述异常并尝试从中恢复将导致内存泄漏、未定义行为和崩溃。

    【讨论】:

    • 那么,没有任何希望可以像在 Javascript 和其他语言中那样使用吗?
    • 不。使用的设计模式是异常是可发现的错误。
    • 如果异常是不可恢复的错误,为什么语法中包含一种捕获并从中恢复的方法,或者即使抛出异常也执行代码,而不是简单地调用已安装的 NSExceptionHandler 并强制终止?
    • 仅仅因为语言具有支持某些东西的语法,并不意味着框架也旨在支持该东西。这些框架有一个非常坚定的政策:异常是不可恢复的错误。试图捕获和恢复违背了框架设计,而且很明显,“跳过”基于框架的堆栈帧的异常违反了记录在案的策略,并且会产生未指定的行为。
    【解决方案2】:

    看看Exception Handling:

    Cup *cup = [[Cup alloc] init];
    
    @try {
        [cup fill];
    }
    @catch (NSException *exception) {
        NSLog(@"main: Caught %@: %@", [exception name], [exception reason]);
    }
    @finally {
        [cup release];
    }
    

    也值得一看:Error Handling Programming Guide

    【讨论】:

    • 不要那样做。异常是 iOS 上的硬错误,不能从中恢复。
    • @bbum:不是您可能抛出的自定义异常。但我同意,对于一般错误处理,此文档可能会更好:developer.apple.com/mac/library/documentation/Cocoa/Conceptual/…
    • 甚至自定义异常。如果这些异常通过任何系统代码框架,则行为未定义。流控制的异常只有在与框架代码 100% 隔离时才是安全的。
    • @bbum,这太旧了,但我读了你的评论(第一个),有一个词“mesntto”......这是什么意思?我在谷歌搜索并没有结果。请告诉。
    • @hagile:它可能应该是“打算”的意思。
    【解决方案3】:

    真正的问题是,你想在那个错误捕获块中做什么?

    有不同的方法可以解决不同类型的错误。您希望将什么样的代码封装在这样的块中?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多