我正在构建一个包含许多不同部分的应用程序,这些部分可以访问远程 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 个问题(非常感谢示例代码)
感谢您提供的任何帮助!错误处理可能是一个很大的麻烦,所以我确实想尽早解决这个问题 =)
笔记:
最佳答案
你可以用 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/