【问题标题】:Exception/Error handling in Objective-C (iPhone app)Objective-C 中的异常/错误处理(iPhone 应用程序)
【发布时间】:2009-07-06 13:19:59
【问题描述】:

我实际上有两个关于我正在制作的 iPhone 应用程序中的异常/错误处理的问题:

  1. 应用程序使用 Internet,但是当没有连接时,应用程序就会死掉(在启动期间)。我该如何处理这个问题以向用户打印一些 infomsg,而不是仅仅被扔回跳板?

  2. 谁能告诉我如何处理例如“找不到页面”或“没有与服务器联系”错误的示例,以便我可以以与上述相同的方式向用户提供某种信息?

【问题讨论】:

    标签: objective-c iphone exception-handling delegates webkit


    【解决方案1】:

    对于崩溃,第一步是使用错误消息和调试器找出导致问题的调用。如果问题是由未捕获的异常引起的,请阅读exception handling 上的这篇 Apple 文章。具体答案实际上取决于您的代码以及导致崩溃的确切原因,因此我不会推测特定的解决方案。

    就检测服务器错误响应代码(例如 404)而言,这更具体到 WebKit。我假设你在 iPhone 上使用UIWebView,你可能已经注意到没有一个主要方法返回错误。这是因为它使用委托模型来异步报告进度或错误。 (这是有道理的,因为您不希望您的 UI 代码受制于加载缓慢(或不存在)的网页。要收到此类错误的通知,有几个步骤。

    1. 采用UIWebViewDelegate协议,为了方便起见,通常在启动网页加载的同一个类中。
    2. 将该对象设置为 UIWebView 实例的委托。 (它有一个 delegate 属性,因此您可以根据自己的喜好使用 uiView.delegate = self[uiView setDelegate:self] 之类的东西。)
    3. 在该类中实现webView:didFailLoadWithError: 方法。 (您也可以通过实现webViewDidFinishLoad: 来在加载完成时收到通知。)您可以在此处包含发生错误时应该发生的逻辑。

    我没有看到任何关于通过此委托方法返回的任何特定错误内容的详细文档,但它是标准的 NSError 对象,我建议通过调用其方法来检查内容,例如 @987654334 @ 和-userInfo

    这里是一些示例代码,为简洁起见排除了#import 语句。

    MyClass.h

    @interface MyClass : NSObject <UIWebViewDelegate> {
      IBOutlet UIWebView* myWebView;
    }
    -(void)webView:(UIWebView*)webView didFailLoadWithError:(NSError *)error;
    @end
    

    MyClass.m

    @implementation MyClass
    - (id) init {
      if ((self = [super init]) == nil)
        return nil;
      // initialize myWebView
      myWebView.delegate = self;
      return self;
    }
    
    - (void) webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error {
      ...
    }
    @end
    

    【讨论】:

    • 是的,我一直在使用 webview,并且已经实现了大部分,只是缺乏关于 didFailLoadWithError 的知识。非常感谢:)
    【解决方案2】:

    测试连接非常简单...

    NSString * test = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.stackoverflow.com"]];
    if (test == nil) {
      //display an alertview saying you don't have an internet connection
    }
    

    【讨论】:

    • 几乎尴尬我自己没有想出这个,但谢谢。正是我想要的!
    • 确保选择不同的 URL 以提高效率 - StackOverflow.com 返回大约 120K 的 HTML 文本,这会导致 NSString 相当大并且加载时间很长。像在已知 URL 上加载特定图像这样的方法也可以很好地工作。
    • @Quinn,是的,我也不会使用完整的页面 URL,但考虑到我们所在的网站,我认为它在说明性上是合适的...... =)
    【解决方案3】:

    使用 URL 来测试连接不是一个好主意,它不足以确定 Internet 连接是否已关闭、网站已关闭或其他网络问题等,最重要的是它会增加通话至网络流量。

    看Apple网站上的Reachability demo,它使用正确的方式来判断连接,包括你是否在wifi上等等。

    【讨论】:

      猜你喜欢
      • 2011-04-10
      • 2018-07-18
      • 1970-01-01
      • 2015-03-29
      • 2013-11-03
      • 1970-01-01
      • 2010-11-16
      • 2012-04-23
      • 2014-01-08
      相关资源
      最近更新 更多