目标c iPhone重定向到未捕获异常的错误页面

时间:2012-11-05 02:46:47

标签: iphone objective-c ios exception-handling error-handling

嗨大家我有一个类我想将用户重定向到错误页面,如果它是:未捕获的异常,捕获的异常或自定义异常。我还想删除错误电子邮件。 (以便我通知)。

我无法访问此类中的当前视图控制器(在未捕获的异常情况下)。因为它是由委托监听器onUncaughtException(NSException* exception)触发的。

如何访问当前视图控制器,或者将模块重定向用户模式重定向到错误视图控制器?

#import "ErrorHelper.h"
#import "ErrorViewController.h"
#import "Global.h"
#import "AppDelegate.h"

@implementation ErrorHelper


+(void) handleUncaughtError:(NSException*) exception
{
    NSLog(@"Uncaught exception occurred!");

    [self sendErrorEmailIfAppropriate:exception :nil];
    [self redirectToErrorPage];
}

+(void) handleCaughtError:(NSException*) exception
{
    NSLog(@"Error caught!!");

    [self sendErrorEmailIfAppropriate:exception :nil];
    [self redirectToErrorPage];
}

+(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 redirectToErrorPage];


}

+(void) sendErrorEmailIfAppropriate:(NSException*) exception :(NSString*)details
{
    if([[Global get] isInTestMode] || [[Global get] isInLiveMode]) {
        bool isCustomException = details != nil;

    }
}

+(void) redirectToErrorPage
{
    /*Try redirect user to error page
    E.G:
     -There's been an error, our App Dev team will try and resolve the issue for you
     -Regards -Dev team

    */
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

}

@end

5 个答案:

答案 0 :(得分:4)

您应该假设Cocoa异常是不可恢复的。不要抛弃它们,不要将它们添加到您的程序中。 (在C ++中使用异常是好的,尽管在这方面混合使用C ++和ObjC可能是不安全的,因为ObjC不是为此控制流而设计的,也不是在放松时清理)。

有一些奇怪的ObjC API抛出,你可以从其中一些恢复。如果可能,请使用不抛出的替代方案。如果您在此方案中必须尝试/捕获,那么您应该使您的处理程序尽可能地位于调用点的本地。假设未被捕获的ObjC异常或由高级处理程序捕获的异常是不可恢复的。

现在,因为您捕获的异常是调用站点的本地异常,您可以轻松添加逻辑以将错误传播到视图控制器或返回到事件循环(例如AlertView)。是的,在这种情况下,您可能会有一些错误输出参数或返回值。

电子邮件是一个单独的问题。

答案 1 :(得分:1)

如果你真的想要实现这一点,你可以尝试类似的事情,

1 - 将当前屏幕对象存储在viewDidAppear方法中的UIViewController对象(应用程序级别)中。

2 - 这将为您提供应用程序中的当前屏幕。

(我没有测试过这个,但我认为应该可行)

3 - 发送通知(bcoz现在你有当前的屏幕实例)。

4 - 显示错误页面

答案 2 :(得分:1)

在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;

这个想法是由于任何对象引起的所有崩溃最终将通过main.m类,这是在整个应用程序生命周期中看到崩溃的最佳位置。

答案 3 :(得分:1)

请参阅Showing an alert in an iPhone top-level exception handler以获取有关如何安装全局异常处理程序的信息..但正如justin所说,异常应被视为'致命' - 您可以打开网址/显示网页视图甚至

但之后不要尝试恢复正常操作

答案 4 :(得分:1)

我试过这个:exception_handler它的工作!只需编写您的电子邮件发送代码而不是警报视图。

- (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 sharedApplication] 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;
}

在界面中,

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