代码之家  ›  专栏  ›  技术社区  ›  Richard J. Ross III

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

  •  1
  • Richard J. Ross III  · 技术社区  · 14 年前

    我(你们中的一些人从我的其他问题中知道:)正在构建cocoa touch静态库,我有代码 [NSException raise:@"This is the name of my exception" format:@"This is my format", nil] 作为子类化的捷径散布在我的项目中 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 回复  |  直到 14 年前
        1
  •  3
  •   bbum    14 年前

    否——如果您想要不同类型的异常,请将NSException子类化。

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


    至于为什么不应该使用异常;框架是显式设计和实现的,因此异常只用于指示不可恢复的错误。

    您不能通过清理@finally中本地作用域中的内存来“修复”这个问题(就像您可以通过“应用足够的锁”使非线程安全的代码成为线程安全一样)。

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

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

        2
  •  1
  •   Tilo Prütz    14 年前

    不是吗 NSException 然后你可以写

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