Objective-C捕获特定类型的异常
我(正如你们中的一些人从我的其他问题中所知道的:)正在构建一个cocoa touch静态库,我的代码Objective-C捕获特定类型的异常,objective-c,exception-handling,try-catch,Objective C,Exception Handling,Try Catch,我(正如你们中的一些人从我的其他问题中所知道的:)正在构建一个cocoa touch静态库,我的代码[NSException Rise:@“这是我的异常名称”格式:@“这是我的格式”,nil]分散在我的项目中,作为子类化NSException的快捷方式。这是回来咬我,因为我只需要捕捉一个例外,它的名称中有一个特定的字符串,并让其他人通过 现在我知道,如果我将NSException子类化,我可以做到: @try { NSLog(@"This is some code that might
[NSException Rise:@“这是我的异常名称”格式:@“这是我的格式”,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");
}
但是有没有比重构所有代码更简单的方法呢?否——如果需要不同类型的异常,可以使用子类NSException
但是,iOS上的控制流不应使用异常。异常应仅用于不可恢复的错误。不要使用异常来验证用户输入
至于为什么不应该使用异常;这些框架是明确设计和实现的,因此异常仅用于指示不可恢复的错误 通过框架中的代码抛出的任何异常(抛出到框架中的堆栈框架上)都将具有未定义的行为 您无法通过在@finally中清理本地作用域中的内存来“修复”此问题(正如您可以通过“应用足够的锁”使非线程安全代码成为线程安全代码一样) 对于不可恢复的错误,继续并抛出NSExceptions,报告错误,然后崩溃。但是,考虑到在检测到问题时,调用Exabter()可能会更好,因此崩溃包含完整的StActTrace.< 对于可恢复的错误,请以与其他框架相同的模式使用NSError。No——如果需要不同类型的异常,请使用NSException子类 但是,iOS上的控制流不应使用异常。异常应仅用于不可恢复的错误。不要使用异常来验证用户输入
至于为什么不应该使用异常;这些框架是明确设计和实现的,因此异常仅用于指示不可恢复的错误 通过框架中的代码抛出的任何异常(抛出到框架中的堆栈框架上)都将具有未定义的行为 您无法通过在@finally中清理本地作用域中的内存来“修复”此问题(正如您可以通过“应用足够的锁”使非线程安全代码成为线程安全代码一样) 对于不可恢复的错误,继续并抛出NSExceptions,报告错误,然后崩溃。但是,考虑到在检测到问题时,调用Exabter()可能会更好,因此崩溃包含完整的StActTrace.<
对于可恢复的错误,请以与其他框架相同的模式使用NSError。NSException类没有访问器来读取要匹配的字符串吗? 然后你就可以写了
@try {
…
} @catch (NSException *e) {
if ([[e …] isEqual: @"…"]) {
…
} else {
@throw e;
}
}
NSException
类是否有一个访问器来读取要匹配的字符串?
然后你就可以写了
@try {
…
} @catch (NSException *e) {
if ([[e …] isEqual: @"…"]) {
…
} else {
@throw e;
}
}
好吧,亲爱的,这可能意味着一些不眠之夜(148次,哎哟!),但不是,这些都是重大错误,如无效索引、文件损坏、锁定模式等。为什么不将异常用于“正常”呢错误处理?@Tilo,因为内存经常被他们泄漏,因为他们会绕过您或苹果正在进行的任何手动管理。内存被程序员泄漏:-P.-但我明白这一点。他们根据定义绕过了它。因此,在使用此类异常时,您只需记住,您应该注意内存管理。这就是
@finally
的好处。好吧,亲爱的,这可能意味着一些不眠之夜(148次,哎哟!)),但不,这些都是重大错误,如无效索引、文件损坏、锁定模式等。为什么不将异常用于“正常”呢错误处理?@Tilo,因为内存经常被他们泄漏,因为他们会绕过您或苹果正在进行的任何手动管理。内存被程序员泄漏:-P.-但我明白这一点。他们根据定义绕过了它。因此,在使用此类异常时,您只需记住,您应该注意内存管理。这就是@最后的好处。