Objective-C捕获特定类型的异常

时间:2010-10-18 12:08:26

标签: objective-c exception-handling try-catch

我(有些人从我的其他问题中得知:) :)正在构建一个可可触摸静态库,我将代码[NSException raise:@"This is the name of my exception" format:@"This is my format", nil]分散在整个项目中作为子类化NSException的快捷方式。这回过头来咬我,因为我只需要抓住一个在名称中有一个字符串的异常,并让其他人过去。

现在我知道,如果我继承NSException,我可以这样做:

@try {
    NSLog(@"This is some code that might raise an exception");
}
@catch (MyException *e){
    NSLog(@"Yep, something went wrong....%@", e);
}
@finally {
    NSLog(@"This is my cleanup code");
}

但是这样做比重构我的所有代码还容易吗?

2 个答案:

答案 0 :(得分:3)

否 - 子类NSException如果您想要不同类型的异常。

但是,不应将异常用于iOS上的控制流。例外应仅用于不可恢复的错误。不要使用例外来验证用户输入。


至于为什么你不应该使用例外;框架是明确设计和实现的,因此Exceptions仅用于指示不可恢复的错误。

通过框架中的代码抛出的任何异常 - 抛出框架中的堆栈框架 - 将具有未定义的行为。

你不能通过在@finally中清理本地作用域中的内存来“修复”这个问题(通过“应用足够的锁”可以使非线程安全的代码线程安全得多)。

对于不可恢复的错误,请继续并抛出NSExceptions,报告错误并崩溃。但是,考虑到在检测到问题时调用abort()可能会更好,因此崩溃包含完整的堆栈跟踪。

对于可恢复的错误,请使用与其余框架相同模式的NSError。

答案 1 :(得分:1)

NSException类不是读取您想要匹配的字符串的访问者吗? 然后你可以写

@try {
    …
} @catch (NSException *e) {
    if ([[e …] isEqual: @"…"]) {
        …
    } else {
        @throw e;
    }
}