Как упомянул @David, мы можем использовать нижеприведенный код
@try{
//your code
} @catch (NSException* exception) {
NSLog(@"Got exception: %@ Reason: %@", exception.name, exception.reason);
}
и @Moshe Kravchik, в некоторых ситуациях некоторые исключения не перехватываются, то есть в основном, когда мы отправляем новый блок в очередь, поэтому ярекомендовал бы добавить отдельный блок try catch для каждой отправки очереди.
т.е. try..catch в main () не будет перехватывать исключение, произошедшее в классе AppDelegate, поэтому необходимо добавить отдельный try..catch в AppDelegate
, например:
- (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 );
Подробнее о необученном исключении здесь .