【问题标题】:What's the difference between objc_exception_throw and [NSException raise]?objc_exception_throw 和 [NSException raise] 有什么区别?
【发布时间】:2012-06-17 18:43:51
【问题描述】:

我一直在为 XCode 使用的一个有用提示是 adding breakpoints on exceptions

我想知道为什么我们需要添加两个断点——一个用于objc_exception_throw,一个用于[NSException raise]

一种涵盖哪些情况而另一种不涵盖?

【问题讨论】:

    标签: objective-c cocoa exception exception-handling


    【解决方案1】:

    以下是 Apple 文档中关于异常的内容:

    @throw 和 raise 之间的一个重要区别是后者 只能发送到 NSException 对象,而 @throw 可以 其他类型的对象作为其参数(例如字符串对象)。可可 应用程序应该只@throw NSException 对象。

    这意味着如果您正在实现 Cocoa applciation project 并且如果您严格遵循 @throw 只有 NSExeption 对象,它们是相同的。

    参考:Link

    【讨论】:

      【解决方案2】:

      您应该只在objc_exception_throw 上使用断点。方法-[NSException raise] 调用objc_exception_throw,所以objc_exception_throw 涵盖了-[NSException raise] 涵盖的所有情况。反之则不然:@throw 指令被编译为直接调用objc_exception_throw。这种方法显示了差异:

      - (void)throwAndCatch
      {
          @try {
              NSException *exception = [[NSException alloc] initWithName:@"Test" 
                                                                  reason:@"test" 
                                                                userInfo:nil];
              @throw exception;
          }
          @catch (NSException *exception) {
              NSLog(@"Caught");
          }
      }
      

      调用-throwAndCatch 时,-[NSException raise] 上的断点无效,而objc_exception_throw 上的断点将起作用。

      【讨论】:

        猜你喜欢
        • 2011-06-15
        • 2021-05-15
        • 1970-01-01
        • 2017-03-04
        • 1970-01-01
        • 2012-12-20
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        相关资源
        最近更新 更多