Well, dunno if this will help you but in my apps I've managed to show an UIAlertView
with an explanation to the user about the crash, the exception type, its description and the stack trace (all using the NSSetUncaughtExceptionHandler
method), like this:

Then I offer the recommended option of killing the app or continue despite that the app may be unstable. In my case it affected partially the app functionality, so in most of the cases the user could save its work and close safely the app.
If you want I can edit the answer and post here the code (I'll have to search through my Xcode projects folder, that's why I haven't posted it).
EDIT:
On the AppDelegate delegate's method willFinishLaunchingWithOptions
I set the NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
Then on I create the handler method as follows:
static void uncaughtExceptionHandler(NSException *exception)
{
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"kDisculpe", nil) message:[NSString stringWithFormat:@"%@ %@%@ %@%@ %@", NSLocalizedString(@"kErrorText", nil), [exception name], NSLocalizedString(@"kErrorDescripcion", nil), [exception reason], NSLocalizedString(@"kErrorTrazaPila", nil), [exception callStackReturnAddresses]] delegate:[[UIApplication sharedApplication] delegate] cancelButtonTitle:NSLocalizedString(@"kContinuar", nil) otherButtonTitles:NSLocalizedString(@"kSalir", nil), nil] show];
[[NSRunLoop currentRunLoop] run];
}
Then on the AlertView's delegate method clickedButtonAtIndex
I set:
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if ([[alertView title] isEqualToString:NSLocalizedString(@"kDisculpe", nil)]) {
switch (buttonIndex) {
case 0:
if ([[alertView title] isEqualToString:NSLocalizedString(@"kDisculpe", nil)]) {
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"kAdvertencia", nil) message:NSLocalizedString(@"kAppContinuaraInestable", nil) delegate:[[UIApplication sharedApplication] delegate] cancelButtonTitle:NSLocalizedString(@"kContinuar", nil) otherButtonTitles:nil] show];
}
break;
case 1:
exit(0);
break;
}
}
}
Notice that the only important thing I did is the [[NSRunLoop currentRunLoop] run];
I hope this will help you.