我(有些人从我的其他问题中得知:) :)正在构建一个可可触摸静态库,我将代码[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");
}
但是这样做比重构我的所有代码还容易吗?
答案 0 :(得分:3)
否 - 子类NSException如果您想要不同类型的异常。
但是,不应将异常用于iOS上的控制流。例外应仅用于不可恢复的错误。不要使用例外来验证用户输入。
至于为什么你不应该使用例外;框架是明确设计和实现的,因此Exceptions仅用于指示不可恢复的错误。
通过框架中的代码抛出的任何异常 - 抛出框架中的堆栈框架 - 将具有未定义的行为。
你不能通过在@finally中清理本地作用域中的内存来“修复”这个问题(通过“应用足够的锁”可以使非线程安全的代码线程安全得多)。
对于不可恢复的错误,请继续并抛出NSExceptions,报告错误并崩溃。但是,考虑到在检测到问题时调用abort()可能会更好,因此崩溃包含完整的堆栈跟踪。
对于可恢复的错误,请使用与其余框架相同模式的NSError。
答案 1 :(得分:1)
NSException
类不是读取您想要匹配的字符串的访问者吗?
然后你可以写
@try {
…
} @catch (NSException *e) {
if ([[e …] isEqual: @"…"]) {
…
} else {
@throw e;
}
}