9

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

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

4

3 回答 3

13

尽管 Objective-C 确实有@try/ @catch,但它对你帮助不大。当您到达 时@catch,发生错误的堆栈帧将消失。

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

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

于 2012-12-08T05:00:01.723 回答
8

在此处输入图像描述 在此处输入图像描述

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

@try {

    // Your statements here
 }
 @catch (NSException * e) {
    NSLog(@"Exception: %@", e);
 }
 @finally {
    NSLog(@"finally");
 }
于 2012-12-08T04:59:21.770 回答
3
    //////////////////////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
}
于 2013-06-21T17:52:45.620 回答