iphone - 对象 C : Creating a standard try-catch-block for use through the application

标签 iphone objective-c ios ios4

我正在构建一个包含许多不同部分的应用程序,这些部分可以访问远程 api 调用(包括我自己的和其他人的)。可能会发生许多错误,并且为了加剧问题,不同的库以不同的方式处理这些错误。

本质上,我想对所有这些远程调用使用相同的错误处理 block 。

这就是我使用 Ruby 的方式,但我不确定如何以同样的方式操作 objective-c

  //universal function to handle standard remote errors across errors
  def universal_handling
    begin
      yield
    rescue Exception => e
      // handle different exceptions accordingly  
      // allow crash if unexpected exception
    end
  end

  //how i would use the above block
  universal_handling{  //any of my remote call here  }

所以,我有 2 个问题(非常感谢示例代码)
  • 我将如何在 Objective-C 中编写等效代码?至关重要的是,我可以在整个应用程序中使用相同的处理 block
  • 在 iOS 开发中,这是一种好的做法吗?

  • 感谢您提供的任何帮助!错误处理可能是一个很大的麻烦,所以我确实想尽早解决这个问题 =)

    笔记:
  • block 完全没问题。我不打算支持 < 4.2 版本。
  • 我阅读了大部分文章,但没有一篇回答如何使用 block 为一组特定的调用编写“包装器”。
  • 最佳答案

    你可以用 block 做一些非常相似的事情:

    typedef void(^WrappableBlock)(void);
    
    ^(WrappableBlock block) {
      @try {
        block();
      }
      @catch(...)
      }
        //handle exception
      }
    }
    

    但是,认识到 Cocoa(和 CocoaTouch)库不是异常安全的,这一点非常重要。通过 Cocoa 框架抛出异常将导致各种问题,因为框架无法正确处理或清理异常,从而使您的应用程序处于可能不一致的状态。正确的 Cocoa 风格是使用 NSError并返回标志以指示错误情况。这既不比使用异常好也不差,只是一种不同的哲学。

    做类似于你的 universal_handling 的事情与 NSError不是那么直截了当,因为它要求您调用的任何内容都符合 NSError图案。那说:
    typedef BOOL(^WrappableBlock)(NSError**);
    
    ^(WrappableBlock block, NSError **err) {
      BOOL success = block(err);
      if(!success) {
        // handle error
      }
    
      return success;
    }
    

    将包装任何只需要 NSError** 的方法并返回 BOOL指示存在错误。显然,此包装器的实用性是有限的,因为您必须将任何有趣的方法包装在另一个 block 中以处理任何其他参数。当然,因为它是 NSError**模式,您总是可以在您想要的时间/地点处理错误并传递 NULL作为 NSError**您不关心的参数(忽略返回值)。

    最后一点:如果您使用可能引发异常的库,则必须在库调用范围内捕获这些异常并处理它们。不要让异常传播,因为它们可能会通过 Cocoa 框架代码传播。因此,universal_handling 的效用你建议的 block 是有限的。

    关于iphone - 对象 C : Creating a standard try-catch-block for use through the application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6389003/

    相关文章:

    iPhone - 初始化图像最有效的内存方式?

    iphone - 更新 Cocos2d iPhone 中 HUD 上的标签?

    iphone - 将一个 NSNumber 的 NSSet 变成一个 int 的 NSSet

    iphone - 关于 UITableView 和 deleteRowsAtIndexPaths 的问题

    ios - UIView 中的黑色背景?

    ios - Swift:为什么需要省略第一个参数的名称,而不是函数调用中的后续参数

    iphone - 使用自定义 UIBarButton 进行推送转场

    ios - 如何以编程方式在 iOS 中添加图标覆盖?

    ios - UITableView tableHeaderView 中的 UIButton 不响应触摸

    ios - 在 Swift 中捕获 NSJSONSerialization 错误