@throw 没有被@catch 块捕获?

Posted

技术标签:

【中文标题】@throw 没有被@catch 块捕获?【英文标题】:@throw not caught by @catch block? 【发布时间】:2016-05-20 07:27:14 【问题描述】:

如果有类似的代码

@try

    @throw [NSException new];

@catch (NSException ex)

    NSLog(@"exception caught");

在这种情况下,代码不会转到@catch 块,而是应用程序崩溃。我们应该如何在objective-c中捕获@throw抛出的异常

【问题讨论】:

【参考方案1】:

[NSException new] 实例化一个null 类,因为它不包含有用的信息。它不会生成NSException 实例,因此您的:

@catch (NSException *ex)

    NSLog(@"exception caught");

没用。但是,如果您使用:

@catch (id exception)



你会抓住这个空物体。

摘自Handling Exceptions官方文档:

您可以拥有一系列@catch 错误处理块。每块 处理不同类型的异常对象。你应该点这个 从最具体到最不具体的@catch 块序列 异常对象的类型(最不具体的类型是 id)...

【讨论】:

谢谢,这有效:) 对于其他所有人,这里是更详细讨论相同内容的链接:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…【参考方案2】:

您必须使用

初始化 NSException

@throw [NSException exceptionWithName:@"Exception!" reason:nil userInfo:nil];

或在 Apple 文档的“创建和引发 NSException 对象”页面中列出的其他有效构造 NSException 的方法。 https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSException_Class/index.html#//apple_ref/occ/cl/NSException

【讨论】:

以上是关于@throw 没有被@catch 块捕获?的主要内容,如果未能解决你的问题,请参考以下文章

java中throw抛出的异常一定要用相应的catch块处理吗

JAVA异常处理

C++中throw是跳出整个循环还是整个函数

为啥 iOS 开发中很少用到 try catch 语句

JavaScript全面学习(中高)

php try catch 捕获哪些错误