从完成处理程序/块中引发自定义异常会使目标 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 块中重新引发异常?

捕获多个自定义异常? - C++

获取“调用的目标已引发异常。”在自定义控件中

处理 Kotlin Coroutines 中自定义 okhttp 拦截器引发的异常

JAVA自定义异常

如何正确地在try / except块中引发异常