I found that the best way is to create a simple exception handling delegate class as this allows you to throw exceptions from IBAction methods.
main.mm:
@interface ExceptionDelegate : NSObject @end static ExceptionDelegate *exceptionDelegate = nil; int main(int argc, char **argv) { int retval = 1; @autoreleasepool { // // Set exception handler delegate // exceptionDelegate = [[ExceptionDelegate alloc] init]; NSExceptionHandler *exceptionHandler = [NSExceptionHandler defaultExceptionHandler]; exceptionHandler.exceptionHandlingMask = NSLogAndHandleEveryExceptionMask; exceptionHandler.delegate = exceptionDelegate; // // Set signal handler // int signals[] = { SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGEMT, SIGFPE, SIGBUS, SIGSEGV, SIGSYS, SIGPIPE, SIGALRM, SIGXCPU, SIGXFSZ }; const unsigned numSignals = sizeof(signals) / sizeof(signals[0]); struct sigaction sa; sa.sa_sigaction = signalHandler; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); for (unsigned i = 0; i < numSignals; i++) sigaction(signals[i], &sa, NULL); .... } .... return retval; } static void signalHandler(int sig, siginfo_t *info, void *context) { logerr(@"Caught signal %d", sig); exit(102); } @implementation ExceptionDelegate - (BOOL)exceptionHandler:(NSExceptionHandler *)exceptionHandler shouldLogException:(NSException *)exception mask:(unsigned int)mask { logerr(@"An unhandled exception occurred: %@", [exception reason]); return YES; } - (BOOL)exceptionHandler:(NSExceptionHandler *)exceptionHandler shouldHandleException:(NSException *)exception mask:(unsigned int)mask { exit(101); // not reached return NO; } @end
You need to add the ExceptionHandling.framework project to the project.
source share