Objetivo c networkingirigir el iPhone a la página de error para la exception no detectada

Hola chicos. Tengo una class. Quiero networkingirigir al usuario a la página Error si hubo una exception: no detectada, una exception detectada o una exception personalizada. También quiero eliminar un correo electrónico de error. (para que me notifiquen).

No puedo acceder al controller de vista actual dentro de esta class (en el caso de una exception no detectada). Porque se desencadena con el delegado listener onUncaughtException(NSException* exception) .

¿Cómo puedo acceder al controller de vista actual o, en su defecto, networkingirigir al usuario de forma manual a un controller de vista de Error?

 #import "ErrorHelper.h" #import "ErrorViewController.h" #import "Global.h" #import "AppDelegate.h" @implementation ErrorHelper +(void) handleUncaughtError:(NSException*) exception { NSLog(@"Uncaught exception occurnetworking!"); [self sendErrorEmailIfAppropriate:exception :nil]; [self networkingirectToErrorPage]; } +(void) handleCaughtError:(NSException*) exception { NSLog(@"Error caught!!"); [self sendErrorEmailIfAppropriate:exception :nil]; [self networkingirectToErrorPage]; } +(void) handleCaughtCustomError:(NSString*) ref :(NSString*) details { NSLog(@"Custom error caught!!"); //can do conditional branching on @ref, to do appropriate action. [self sendErrorEmailIfAppropriate:nil :details]; [self networkingirectToErrorPage]; } +(void) sendErrorEmailIfAppropriate:(NSException*) exception :(NSString*)details { if([[Global get] isInTestMode] || [[Global get] isInLiveMode]) { bool isCustomException = details != nil; } } +(void) networkingirectToErrorPage { /*Try networkingirect user to error page EG: -There's been an error, our App Dev team will try and resolve the issue for you -Regards -Dev team */ AppDelegate *appDelegate = [[UIApplication shanetworkingApplication] delegate]; } 

@fin

Intenté esto desde: exception_handler ¡ Está funcionando! Simplemente escriba su código de envío de correo electrónico en lugar de la vista de alerta.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [window makeKeyAndVisible]; NSSetUncaughtExceptionHandler(&exceptionHandler); return YES; } BOOL exceptionAlertDismissed = FALSE; void exceptionHandler(NSException *exception) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"App Committed Suicide" message:@"Oh dear, that wasn't supposed to happen. You will have to restart the application... sorry!" delegate:[[UIApplication shanetworkingApplication] delegate] cancelButtonTitle:nil otherButtonTitles:@"That's ok!", @"Erm, bye...", nil]; [alert show]; [alert release]; while (exceptionAlertDismissed == FALSE) { [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; } } - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { exceptionAlertDismissed = TRUE; } 

En la interfaz,

 @interface ...appDelegate : NSObject <UIApplicationDelegate, UIAlertViewDelegate> ... void exceptionHandler(NSException *exception); 

Debería estar bajo el supuesto de que las excepciones de cocoa no son recuperables. No los lance, no los agregue a su progtwig. (Usar excepciones en C ++ está bien, aunque mezclar C ++ y ObjC puede ser inseguro en este sentido porque ObjC simplemente no está diseñado para este flujo de control o limpieza al desenrollarse).

Hay algunas API de ObjC extrañas que lanzan, y usted podría recuperarse de algunas de ellas. Si es posible, use una alternativa que no arroje. Si debe intentar / atrapar en este escenario, debe hacer que su manejador sea lo más local posible en el sitio de llamadas . Suponga que una exception ObjC no capturada o una capturada por un manejador de alto nivel es irrecuperable.

Ahora, debido a que su exception capturada es local para el sitio de llamada, puede agregar fácilmente la lógica para propagar el error a un controller de vista o volver al bucle de evento (por ejemplo, un AlertView). Sí, es probable que tenga algunos parameters de error o valores de retorno para introducir en este caso.

El correo electrónico es una pregunta por separado.

Si realmente quieres lograr esto, puedes intentar algo así,

1: almacene su object de pantalla actual en un object UIViewController (nivel de aplicación) en su método viewDidAppear.

2 -Esto le dará la pantalla actual en la aplicación.

(No he probado esto, pero supongo que debería funcionar)

3 – Enviar notificación (bcoz ahora tiene esa instancia de pantalla actual).

4: muestra tu página de error

vea Mostrar una alerta en un manejador de excepciones de nivel superior de iPhone para get información sobre cómo instalar un manejador de excepciones globales … pero como dijo Justin, las excepciones deberían tratarse como 'fatales': puede abrir una url / mostrar una vista web incluso

pero no intentes reanudar la operación normal después

en el uso de la class main.m:

 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = -1; @try { retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } @catch (NSException* exception) { NSLog(@"Uncaught exception: %@", exception.description); --Send email here or Open ur link or Wat ever action u'd like to do or Use the Error helper class of urs HERE-- } [pool release]; return retVal; 

La idea es que todos los lockings debidos a cualquier object finalmente pasen por la class main.m, que es el mejor lugar para ver los lockings en todo el ciclo de vida de la aplicación.