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

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

我(正如你们中的一些人从我的其他问题中所知道的:)正在构建一个cocoa touch静态库,我的代码
[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.-但我明白这一点。他们根据定义绕过了它。因此,在使用此类异常时,您只需记住,您应该注意内存管理。这就是
@最后的好处。