【问题标题】:How to exit the app after an error in user friendly manner?如何以用户友好的方式在出现错误后退出应用程序?
【发布时间】:2011-09-20 06:58:24
【问题描述】:

我需要保护我的代码免受可能的错误。如果它们出现,那么进一步运行应用程序就没有意义了,所以我需要给用户带来一些消息,然后退出应用程序。所以,我正在检查条件,然后发出警报:

if (someError){    
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"No database file exist. App will close now." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
  [alert show];
  [alert release]; 
}

在委托方法中,我正在使用 NSAssert 关闭应用程序:

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
  if (buttonIndex == 0) {
    NSAssert(0, @"closing");
  }
}

另外,我在标头中包含了委托协议。但是,该应用程序只会发出警报,但在按下 OK 后它会冻结,并且我收到一些消息“CoreAnimation:忽略异常:关闭”。我缺少什么或存在哪些其他选项?

【问题讨论】:

    标签: iphone objective-c error-handling nsassert


    【解决方案1】:

    您不应该这样做,这违反了 Apple HIG(人机界面指南):

    iPhone 应用程序不应该以编程方式退出,因为这样做对用户来说就像是崩溃。

    最好向用户提供有关所发生错误的某种反馈,并提供一种无需重新启动应用即可重新启动进程的方法。但是,如果您真的非常想要,您可以使用

    exit(0);
    

    【讨论】:

    • 好的,但是为什么 NSAssert 会退出呢?我在“Beginning iOS 4 application development”一书中看到了它的用法,作者展示了如何使用 SQLite。给出的示例使用 NSAssert 在严重错误时关闭应用程序,例如不存在 SQLite 数据库文件等。
    • 是的,将 NSAssert 视为一种保护措施,主要在开发过程中使用,以确保您的应用程序具有一致的状态。断言也可能留在生产代码中......但是断言主要用于处理意外错误,而不是您期望在某个时候发生的错误。尽可能尝试从错误中恢复(例如,使用“重试”按钮)。
    • 此外,assert 不会以 0 退出代码“清理”关闭,但它确实会使应用程序崩溃(并产生崩溃日志) - 如果您的应用程序在某些情况下反复崩溃,您甚至可能在审核过程中被拒绝情况。
    • 谢谢。然而,如果有人想要实现非常好的用户体验,那么他应该实现(或自己编写)一个可靠的错误/异常处理框架。有趣的是,有多少应用程序拥有它,我猜很少 :) 恕我直言,如果我们想创建一个非常聪明的应用程序,并捆绑所有可能的错误预测和解决方案,那就需要做很多工作了。
    • 我同意 ios 错误处理不如您在 AppKit (Mac) 中的选项强大,但是,您应该能够使用 @987654321 中描述的基本机制来整合一致的错误处理@和Exception Programming Topics
    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 2023-03-29
    • 2011-09-13
    • 2017-12-19
    • 2011-02-18
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    相关资源
    最近更新 更多