从completionhandler / block中抛出自定义异常会使目标c中的应用程序崩溃

时间:2016-06-14 00:22:38

标签: objective-c exception block throw completionhandler

我试图从我的自定义框架中抛出异常。如果它被抛到外面,它运作良好。 但是如果它在块内,应用程序会在[异常加注]崩溃。

如何在目标C中创建具有抛出的完成处理程序/块。

typedef void (^ServerResponse) (id responseObject, BOOL requestSuccess, NSError* error);


- (void)getData:(NSUInteger*)id response:(ServerResponse)response
{
    NSString* url = [NSString stringWithFormat:@"%@data/%@“,ServerUrl,[NSString stringWithFormat:@"%ld",(long)vid]];
…………..
………
if(statuscode == 200 && [response objectForKey:@“something”])
{
                    NSException* exception = [NSException exceptionWithName:@“Name” reason:@“Data id" userInfo:nil];
                    [exception raise];

}
}

1 个答案:

答案 0 :(得分:2)

问题可能是您的块被异步调用。因此,在引发异常时,您可能已经退出了@try - @catch块。您可以通过添加记录某些消息的@finally子句来确认这一点,并且您可能会在引发异常之前看到它被调用。但是如果同步调用该块,则@catch块将成功捕获该异常。

另外,如果要在例程中报告错误,则应传递NSError个对象,而不是像其他语言一样抛出异常。例外情况是您在开发阶段切除的编程错误,而不是用于在常规使用应用程序期间可能出现的情况下的控制流程。

请参阅Exception Programming Topics,其中包含:

  

重要提示:您应该保留使用异常进行编程或意外的运行时错误,例如越界收集访问,尝试改变不可变对象,发送无效消息以及丢失与窗口服务器的连接。在创建应用程序时而不是在运行时,通常会使用异常处理这些类型的错误。