【问题标题】:try catch final is not catching exceptiontry catch finally 没有捕获异常
【发布时间】:2012-01-05 04:37:01
【问题描述】:

当从通讯簿中获取电话号码返回我的应用程序时,如果我错误地获取了一些地址或除电话号码之外的任何其他内容,try catch final 中的代码会给出以下但没有捕获它,任何想法提前表示赞赏:

  *** -[CFDictionary length]: message sent to deallocated instance 0x6a4db70

代码:

strContact = (NSString *)phone; CFRelease(phone);
// NSLog(@"%@", strContact);
CFRelease(multi);
name = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
NSRegularExpression *regex = [[[NSRegularExpression alloc] initWithPattern:@"[a-zA-Z]" options:0 error:NULL] autorelease];
// Assuming you have some NSString myString.
NSUInteger matches = [regex numberOfMatchesInString:strContact options:0 range:NSMakeRange(0, [strContact length])];

【问题讨论】:

  • 请在问题中输入一些代码
  • 可能是另一个 catch 块先捕获它吗?
  • strContact = (NSString *)phone; CFRelease(电话); // NSLog(@"%@", strContact); CFR 释放(多); name = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); NSRegularExpression *regex = [[[NSRegularExpression alloc] initWithPattern:@"[a-zA-Z]" options:0 error:NULL] autorelease]; // 假设你有一些 NSString myString。 NSUInteger 匹配 = [regex numberOfMatchesInString:strContact options:0 range:NSMakeRange(0, [strContact length])];
  • 我在 NSMakeRange 中遇到错误
  • 代码中的 try/catch 块在哪里?

标签: iphone objective-c xcode exception try-catch


【解决方案1】:

好的,我想我现在明白你的问题了。我只是花了一点时间。

所以,我假设您启用了 Zombie Objects (NSZombieEnabled),并且您想知道为什么无法使用 @try/@catch 结构捕获此错误 - 向僵尸发送消息。

简短的回答是 NSZombies 不会抛出 Objective-C 异常(您可以通过这种方式捕获)。没有真正的意义,因为无论如何您实际上都不会使用 NSZombieEnabled 发布应用程序。这旨在成为您在调试器或 Instruments 中使用的调试工具。

在您的实际应用程序中,当您关闭 NSZombie 时,仍然不会为此捕获异常,因为您只会得到一个 EXE_BAD_ACCESS,这是一个 UNIX 信号(在此级别不是这种类型的异常)。

最后一点是,不建议将 Objective-C 异常(您可以 @try/@catch 的类型)用于您希望能够从中恢复的错误。或者换句话说,这仅适用于致命错误,您可能会在其中进行一些清理,然后让您的应用仍然崩溃。

做你想做的事情的正确方法是实际测试你可能会得到的不同类型或不同的值,然后适当地处理每种情况。您可以使用普通的 if/else 条件或类似的东西来做到这一点。如果需要,您可以测试nil 的值,并且可以使用[someObj isKindOfClass:[MyExpectedClass class]] 查看对象是否属于特定类

希望我正确理解了这个问题?

【讨论】:

  • 感谢您的帮助,最后一个问题,我正在处理未捕获的异常处理,我不知道它是如何工作的,请您告诉我问题在于它不是任何类型的异常。我该怎么称呼它,
  • 对不起,我不明白这个问题。可以举个例子吗?
  • 我的意思是我将在必要时向我的项目添加未捕获异常处理的实现cocoawithlove.com/2010/05/… 其次我想问一下僵尸和异常之间有什么区别。
【解决方案2】:

问题可能是您在将phone 分配给strContact 之后释放它,然后使用strContact。当您释放phone 时,字符串对象可能会被释放,因此strContact 中的指针不再有效。

【讨论】:

    【解决方案3】:

    你确定phone 是一个字符串吗?看起来您将该对象存储在可能不是字符串的 NSString* 指针“strContact”中,因此错误消息中的“CFDictionary”。

    看来您有两个问题需要解决:

    1. 获取正确类型的对象。
    2. 确保不会在需要之前释放对象。用完对象后试试放 CFRelease!

    【讨论】:

    • 是的,我明白了,我只是想知道为什么这个异常没有在 try catch final 中被捕获。我只检查了 phonenumber 属性,现在工作正常,我实际上想在将来的意外异常中使用异常处理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2011-05-27
    相关资源
    最近更新 更多