我正在使用Restkit的对象管理器来处理我的远程api调用。

它会引发NSAssert导致各种错误。例如,如果服务器返回错误页面而不是格式正确的json,则即使代码没有问题,它也会引发NSAssert。

我有些困惑(大多数与异常和nsasserts的一般处理有关)

  • 我们应如何处理这些NSAsserts错误?例如,我们想要重试几次,然后显示“出了点问题”消息。 (而不是使应用程序崩溃)
  • 我尝试使用catch-try块来捕获错误(下面的代码),但是没有捕获到错误。所以我的应用程序一直在失败。此外,无论如何我都不喜欢在发布模式下使用try-catch。
  • 就我的理解而言,为什么Restkit使用NSAsserts,而不是其他失败的

  • 非常感谢您的帮助-非常感谢!
    // code to catch NSAssert that sharedManager throws
    @try{
        [sharedManager loadObjectsAtResourcePath:self.resourcePath delegate:self];
    }
    
    @catch (NSException *ex) {
        NSLog(@"exception caught");
    }
    

    最佳答案

    通常,您不应该尝试捕获NSAssert错误,因为它们意味着出现了严重的错误-例如应用程序内部状态变得不一致,您使用的库不正确等,因此需要退出应用程序。[1]

    未捕获错误的原因是因为NSAssert引发了NSInternalInconsistencyException [2],它是一个字符串,而不是NSException的实例。您仍然可以按照[3]的方式捕获它们,例如与

        @catch (id ex)
    

    但由于上述原因,不建议使用。

    要回答您的第三个问题,请提供有关引发NSAssert等的更多详细信息。

    [1] What's the point of NSAssert, actually?

    [2] http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/macro/NSAssert

    [3] http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Exceptions/Tasks/HandlingExceptions.html

    08-16 11:15