如何在加载视图时正确捕获异常

时间:2016-02-16 22:29:02

标签: ios exception try-catch

我想了解如何才能正确捕获并向用户显示异常原因,这些异常是在处理viewDidLoad时出现的?我试图像这样解决这个问题,但是我遇到了显示AlertWindow的问题。 错误:由于未捕获的异常,无法识别的选择器发送到实例并终止应用程序。

- (void)viewDidLoad {
    @try {
        [super viewDidLoad];
        APPDataBase *sharedDataBase = [APPDataBase sharedDataBase];
        self.navigationItem.hidesBackButton = YES;
        recievedArray = [recievedURL componentsSeparatedByString:@" "];
        [self fillUpTableViewWithTitles];
        if ([self isInternetConnected]){
            [sharedDataBase saveData:feeds WithKey:@"savedFeeds"];
        }
        else
        {
            feeds = [sharedDataBase loadDataWithKey:@"savedFeeds"];
        }
        [NSException raise:@"Invalid smth" format:@"Error error error, dangerous, wow"];
    }
    @catch (NSException *exception) {
        [self showAlertWindowWithString:exception];
    }
}

showAlertWindowWithString:方法代码

-(void)showAlertWindowWithString:(NSString *)string{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:string message:@"Press OK button." preferredStyle:UIAlertControllerStyleAlert];
    alertController.view.frame = [[UIScreen mainScreen] applicationFrame];

    [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){
        [self okButtonTapped];
    }]];

    UIViewController *topRootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    while (topRootViewController.presentedViewController){
        topRootViewController = topRootViewController.presentedViewController;
    }

    [topRootViewController presentViewController:alertController animated:YES completion:nil];
}

我搞砸了一下,因为我只能访问iDevice Emulator,所以我想至少以这种方式捕获“真实设备”错误。或者,也许,在发生此类异常时,还有其他方法可以使应用程序不崩溃吗?

1 个答案:

答案 0 :(得分:0)

您正在将NSException *传递给showAlertWindowWithString:方法但是以NSString *方式接收,但string仍然是NSException - 然后您通过此方法到alertControllerWithTitle - 只要该方法尝试对NSString执行NSException操作,您就会收到无法识别的选择器异常。

您可以执行以下操作:

@catch (NSException *exception) {
    [self showAlertWindowWithString:exception.reason];
}

但实际上,@try/@catch并不是Objective C iOS编程中的常见范例。简单地检查错误并采取适当的措施或显示用户友好的警报更为常见。消息。通常应在开发期间识别异常,并确定异常的根本原因。