【问题标题】:Objective-C catch specific type of exceptionObjective-C 捕获特定类型的异常
【发布时间】:2011-04-26 21:57:18
【问题描述】:

我(正如你们中的一些人从我的其他问题中知道的那样 :))正在构建一个 cocoa-touch 静态库,我将代码 [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");
}

但是有没有比重构所有代码更简单的方法呢?

【问题讨论】:

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


    【解决方案1】:

    否——如果你想要不同类型的异常,则子类化 NSException。

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


    关于为什么你不应该使用异常;这些框架是明确设计和实现的,因此异常仅用于指示不可恢复的错误。

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

    您无法通过在 @finally 中清理本地范围内的内存来“修复”此问题(就像通过“应用足够的锁”使非线程安全代码线程安全一样)。

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

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

    【讨论】:

    • 为什么不应该将异常用于“正常”错误处理?
    • @Tilo 因为内存经常被他们泄露,因为他们会绕过你或苹果正在做的任何手动管理。
    • 内存被程序员泄露了:-P。 ——但我明白这一点。
    • 他们根据定义绕过它。因此,当使用此类异常时,您只需要记住您应该注意您的内存管理。这就是@finally 的好处。
    【解决方案2】:

    NSException 类没有访问器来读取您要匹配的字符串吗? 然后你可以写

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2016-05-09
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      相关资源
      最近更新 更多