我在我的应用程序的 main.m 中遇到应用程序崩溃,并且不知道为什么会发生错误,因为 xcode 没有告诉我崩溃发生的位置,它告诉我它在 return UIApplicationMain(argc, argv ...)这什么也没告诉我。
有没有办法在 Objective-C 中使用相当于 C++ 中的 try/catch 来准确查看错误发生的位置?
我在我的应用程序的 main.m 中遇到应用程序崩溃,并且不知道为什么会发生错误,因为 xcode 没有告诉我崩溃发生的位置,它告诉我它在 return UIApplicationMain(argc, argv ...)这什么也没告诉我。
有没有办法在 Objective-C 中使用相当于 C++ 中的 try/catch 来准确查看错误发生的位置?
尽管 Objective-C 确实有@try
/ @catch
,但它对你帮助不大。当您到达 时@catch
,发生错误的堆栈帧将消失。
您需要设置一个在异常时中断的断点:打开Breakpoint Navigator页面(右侧第二个按钮),然后单击导航器页面底部的 [+]。选择“添加异常断点...”,然后单击[完成]。
现在,每次您的程序抛出异常时,程序都会中断调试器。
我在下面给出了 try catch 语法,但除此之外,你可以做的是,在 Xcode 中,你可以设置断点。在项目浏览器的左侧,单击 Breakpoints 选项卡。在左下角,您会找到一个 +。(上图)点击它,它会给你一个设置异常断点的选项。这将做的是它会在任何发生崩溃的线路处停止。因此,您无需在每个地方都设置 try catch 语句。
@try {
// Your statements here
}
@catch (NSException * e) {
NSLog(@"Exception: %@", e);
}
@finally {
NSLog(@"finally");
}
//////////////////////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
}