【问题标题】:Try-Catch equivalent in Objective-CObjective-C 中的 Try-Catch 等效项
【发布时间】:2012-11-26 07:28:44
【问题描述】:

我在我的应用程序的 main.m 中遇到应用程序崩溃,并且不知道为什么会发生错误,因为 xcode 没有显示崩溃发生的位置,它告诉我它在 return UIApplicationMain(argc, argv . ..) 这什么也没告诉我。

有没有办法在 Objective-C 中使用相当于 C++ 中的 try/catch 来查看错误发生的确切位置?

【问题讨论】:

  • 查看this question的答案。
  • 非常感谢。这解决了我的问题。问题是选择器方法的名称和一个大写的 U,而实际的方法有一个小写的 u。编译器没有发现(坏的,坏的),但链接中的解决方案给了我确切的问题所在。再次感谢。

标签: objective-c


【解决方案1】:
    //////////////////////ADVANCED TRY CATCH SYSTEM////////////////////////////////////////
    #ifndef UseTryCatch
    #define UseTryCatch 1
    #ifndef UsePTMName
    #define UsePTMName 0  //USE 0 TO DISABLE AND 1 TO ENABLE PRINTING OF METHOD NAMES WHERE EVER TRY CATCH IS USED
    #if UseTryCatch
    #if UsePTMName
    #define TCSTART @try{NSLog(@"\n%s\n",__PRETTY_FUNCTION__);
    #else
    #define TCSTART @try{
    #endif
    #define TCEND  }@catch(NSException *e){NSLog(@"\n\n\n\n\n\n\
    \n\n|EXCEPTION FOUND HERE...PLEASE DO NOT IGNORE\
    \n\n|FILE NAME         %s\
    \n\n|LINE NUMBER       %d\
    \n\n|METHOD NAME       %s\
    \n\n|EXCEPTION REASON  %@\
    \n\n\n\n\n\n\n",strrchr(__FILE__,'/'),__LINE__, __PRETTY_FUNCTION__,e);};
    #else
    #define TCSTART {
    #define TCEND   }
    #endif
    #endif
    #endif
    //////////////////////ADVANCED TRY CATCH SYSTEM////////////////////////////////////////






Use TRY CATCH IN ANY METHOD LIKE THIS


-(void)anyMethodThatCanGenerateException
{
    TCSTART


    TCEND
}

【讨论】:

    【解决方案2】:

    虽然 Objective-C 确实有一个 @try/@catch,但它对你没有多大帮助。当您到达@catch 时,发生错误的堆栈帧将会消失。

    你需要设置一个在异常时中断的断点:打开Breakpoint Navigator页面(右起第二个按钮),然后点击[+]在导航器页面的底部。选择“添加异常断点...”,然后点击【完成】。

    现在,每次您的程序抛出异常时,程序都会中断调试器。

    【讨论】:

    • 好的,我试过了。 +1 非常好的说明。问题是它再次停在 int main(int argc, char *argv[]) 中的相同位置。堆栈跟踪是汇编语言,我不知道如何阅读异常。还有其他我忽略的细节吗?
    • 将此添加到您的@catch:NSLog(@"Stack trace: %@", [exception callStackSymbols]);
    • @HotLicks 感谢您的评论以及您在上面发布的精彩链接!
    【解决方案3】:

    我在下面给出了 try catch 语法,但除此之外,您可以做的是,在 Xcode 中,您可以设置断点。在项目浏览器的左侧,单击 Breakpoints 选项卡。在左下角,您会找到一个 +。 (上图)点击它,它会给你一个设置异常断点的选项。这将做的是它会在任何发生崩溃的线路处停止。因此,您无需在任何地方都设置 try catch 语句。

    @try {
    
        // Your statements here
     }
     @catch (NSException * e) {
        NSLog(@"Exception: %@", e);
     }
     @finally {
        NSLog(@"finally");
     }
    

    【讨论】:

    • 见上 -- 添加NSLog(@"Stack trace: %@", [e callStackSymbols]);
    猜你喜欢
    • 2011-04-15
    • 2011-03-22
    • 2023-04-03
    • 2011-01-23
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多