正如@David 所说,我们可以使用下面的代码
@try{
//your code
} @catch (NSException* exception) {
NSLog(@"Got exception: %@ Reason: %@", exception.name, exception.reason);
}
和@Moshe Kravchik 提到,有些情况下没有捕获到一些异常,主要是当我们在队列中调度新块时,所以我建议为每个队列调度添加单独的 try catch 块。
即main()中的try..catch不会捕捉到AppDelegate类发生的异常,所以需要在AppDelegate中单独添加try..catch
例如:
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
@try{
self.viewController = [[MainViewController alloc] init];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
@try{
NSLog(@"This is a block");
NSObject * b= nil;
[NSArray arrayWithObject:b];
} @catch (NSException* exception) {
NSLog(@"Got exception: %@ Reason: %@", exception.name, exception.reason);
}
});
return [super application:application didFinishLaunchingWithOptions:launchOptions];
} @catch (NSException* exception) {
NSLog(@"Got exception: %@ Reason: %@", exception.name, exception.reason);
}
}
对于任何未捕获的异常,我们应该使用 NSSetUncaughtExceptionHandler,它不会阻止应用程序崩溃。
void onUncaughtException(NSException* exception)
{
NSLog(@"onUncaughtException : %@", exception.reason);
}
int main(int argc, char* argv[])
{
@autoreleasepool {
NSSetUncaughtExceptionHandler(&onUncaughtException);
int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
return retVal;
}
}
对于除异常之外的信号,例如内存使用不当等,我们应该监听特定信号
void signalHandler(int signal)
{
NSLog(@"Got signal %d",signal);
}
signal(SIGPIPE, &signalHandler);
signal(SIGABRT, &signalHandler );
signal(SIGHUP, &signalHandler );
signal(SIGINT, &signalHandler );
signal(SIGQUIT, &signalHandler );
signal(SIGILL, &signalHandler );
signal(SIGIOT, &signalHandler );
signal(SIGFPE, &signalHandler );
signal(SIGSEGV, &signalHandler );
signal(SIGSYS, &signalHandler );
signal(SIGPIPE, &signalHandler );
关于未捕获异常here的更多详细信息。