从完成处理程序/块中引发自定义异常会使目标 c 中的应用程序崩溃
Posted
技术标签:
【中文标题】从完成处理程序/块中引发自定义异常会使目标 c 中的应用程序崩溃【英文标题】:Throwing custom exception from completionhandler/block crashes the app in objective c 【发布时间】:2016-06-14 00:22:37 【问题描述】:我正在尝试从我的自定义框架中抛出异常。如果它被扔到外面,效果很好。 但是如果在块内,应用程序会在 [exception raise] 上崩溃。
如何在目标 C 中创建带有 throws 的完成处理程序/块。
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】:问题可能是您的块被异步调用。因此,在引发异常时,您可能已经退出了 @try
-@catch
块。您可以通过添加一个记录一些消息的@finally
子句来确认这一点,并且您可能会在引发异常之前看到它被调用。但是如果块被同步调用,异常会被@catch
块成功捕获。
顺便说一句,如果你想在例程中报告错误,你应该传递NSError
对象,而不是像在其他语言中那样抛出异常。例外是您在开发阶段消除的编程错误,不适用于在应用程序的日常使用过程中自然出现的情况的控制流。
查看Exception Programming Topics,上面写着:
重要提示:您应该将异常用于编程或意外的运行时错误,例如越界集合访问、尝试改变不可变对象、发送无效消息以及失去与窗口服务器的连接。您通常在创建应用程序时而不是在运行时处理这些类型的异常错误。
【讨论】:
以上是关于从完成处理程序/块中引发自定义异常会使目标 c 中的应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何从 PowerShell 中的 catch 块中重新引发异常?