Obj C:创建一个标准的try-catch-block,供应用程序使用

min*_*eow 1 iphone objective-c ios4 ios

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

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

这就是我用Ruby做的事情,但我不确定如何以相同的方式操纵目标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  }
Run Code Online (Sandbox Code Playgroud)

所以,我有两个问题(示例代码非常感谢)

  1. 我如何在Objective-C中编写等效代码?至关重要的是,我可以在整个应用程序中使用相同的处理块
  2. 在iOS开发中,这是一个好习惯吗?

感谢您提供的任何帮助!错误处理可能是屁股的主要痛苦,所以我确实想早点在=)

笔记:

  1. 积木非常好.我不打算支持<4.2版本.
  2. 我阅读了大部分文章,但没有人回答你如何使用块为特定的一组调用编写"包装器".

Bar*_*ark 5

您可以使用块执行非常类似的操作:

typedef void(^WrappableBlock)(void);

^(WrappableBlock block) {
  @try {
    block();
  }
  @catch(...)
  }
    //handle exception
  }
}
Run Code Online (Sandbox Code Playgroud)

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

做类似的东西你universal_handlingNSError不是那么简单的,因为它会要求任何你打电话遵守NSError格局.那说:

typedef BOOL(^WrappableBlock)(NSError**);

^(WrappableBlock block, NSError **err) {
  BOOL success = block(err);
  if(!success) {
    // handle error
  }

  return success;
}
Run Code Online (Sandbox Code Playgroud)

将包装任何接受NSError**a的方法并返回一个BOOL指示存在错误的方法.显然,这个包装器的实用程序是有限的,因为你必须在其他块中包装任何有趣的方法来处理任何其他参数.当然,因为它是NSError**模式,所以你总是可以在你想要的时间/地点处理错误,并NULL作为NSError**你不关心的参数传递(忽略返回值).

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