0

当在线服务器出现问题时,我希望我的应用程序能够正常运行。我试图将危险线包裹在一个@try块中。然而它仍然像这样崩溃:

方法:

+ (NSArray *)findAllFor:(NSObject *)ratable {
      NSString *ratingsPath = [NSString stringWithFormat:@"%@%@/%@/%@%@",
     [self getRemoteSite],
     [ratable getRemoteCollectionName],
     [ratable getRemoteId],
     [self getRemoteCollectionName],
     [self getRemoteProtocolExtension]];

     Response *res = [ORConnection get:ratingsPath withUser:[[self class] getRemoteUser] 
     andPassword:[[self class] getRemotePassword]];
     NSArray *ratings;
     @try {
          ratings = [self fromXMLData:res.body];
     }
     @catch (NSException *e) {
          ratings = [NSArray array];
     }
    return ratings;
}

堆栈跟踪:

节目接收信号:“SIGABRT”。
2010-08-07 16:38:51.846 TalkToHer[68608:7003] *** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“***-[NSArray objectAtIndex:]:索引 1 超出范围 [0 .. 0]'
*** 第一次抛出调用堆栈:  
(
 0 核心基础 0x02932919 __exceptionPreprocess + 185  
 1 libobjc.A.dylib 0x02a805de objc_exception_throw + 47  
 2 核心基础 0x0292858c -[__NSArrayI objectAtIndex:] + 236  
 3 TalkToHer 0x00009fa7 -[FromXMLElementDelegate 解析器:didEndElement:namespaceURI:qualifiedName:] + 425  
 4 基础 0x0017bcc1 _endElementNs + 453  
 5 libxml2.2.dylib 0x02d9deb6 xmlParseXMLDecl + 1353  
 6 libxml2.2.dylib 0x02da8bc1 xmlParseChunk + 3985  
 7 基础 0x0017b4c2 -[NSXMLParser 解析] + 321  
 8 TalkToHer 0x0000b14d +[NSObject(XMLSerializableSupport) fromXMLData:] + 201  
 9 TalkToHer 0x00031a6c +[评级 findAllFor:] + 320  
 10 TalkToHer 0x00032d67 -[FirstClassContentPiece(Ratable) updateRatings] + 96  
 11 TalkToHer 0x00004d5f __-[InspirationController tableView:didSelectRowAtIndexPath:]_block_invoke_3 + 33  
 12 libSystem.B.dylib 0x9792efe4 _dispatch_call_block_and_release + 16  
 13 libSystem.B.dylib 0x97921a4c _dispatch_queue_drain + 249  
 14 libSystem.B.dylib 0x979214a8 _dispatch_queue_invoke + 50  
 15 libSystem.B.dylib 0x979212be _dispatch_worker_thread2 + 240  
 16 libSystem.B.dylib 0x97920d41 _pthread_wqthread + 390  
 17 libSystem.B.dylib 0x97920b86 start_wqthread + 30  
)
在抛出“NSException”实例后调用终止

我的语法@try @catch错了吗?我试图添加一个@catch块,NSRangeException但似乎这不是正确的方法(它不是一个类)。

此外,服务器错误是由[ratable getRemoteId]有时返回(null)而不是整数引起的。这种行为似乎非常不可预测。如果有人知道为什么ObjectiveResource会这样做,那将会很有帮助。但是我还是想知道怎么用@try @catch

4

2 回答 2

0

正如我现在所理解的那样,抛出异常应该只用来提醒你的库的用户他们犯了编程错误。我仍然很好奇为什么我使用的语法没有防止崩溃。我知道错误发生在几个级别。但是@try {} @catch {} 块应该处理我调用的方法调用的所有方法......

无论如何,对于任何想要从 Rails 风格的 restful 资源中获取作用域对象的人来说,这里是固定代码。

+ (NSArray *)findAllFor:(NSObject *)ratable {
    NSString *ratingsPath = [NSString stringWithFormat:@"%@%@/%@/%@%@",
                          [self getRemoteSite],
                          [ratable getRemoteCollectionName],
                          [ratable getRemoteId],
                          [self getRemoteCollectionName],
                          [self getRemoteProtocolExtension]];

    Response *res = [ORConnection get:ratingsPath withUser:[[self class] getRemoteUser] 
                      andPassword:[[self class] getRemotePassword]];
    NSError **aError;
    if([res isError]) {
        *aError = res.error;
        return nil;
    }
    else {
        return [self performSelector:[self getRemoteParseDataMethod] withObject:res.body];
    }
}
于 2010-08-08T23:03:10.887 回答
-1

你没有。在这些情况下,您可以修复代码以不引发异常。

于 2010-08-07T23:08:26.650 回答