[英]Try-catch exception handling practice for iPhone/Objective-C
[英]Exception/Error handling in Objective-C (iPhone app)
我实际上有两个关于我正在制作的iPhone应用程序中的异常/错误处理的问题:
该应用程序使用Internet,但是当没有连接时,应用程序就会死掉(在启动期间)。 我该如何处理这个问题来向用户打印一些infomsg,而不是仅仅被扔回跳板?
有人能告诉我一个如何处理例如“找不到页面”或“没有联系服务器”错误的例子,所以我可以用与上面相同的方式向用户提供某种信息吗?
对于崩溃,第一步是使用错误消息和调试器来确定导致问题的呼叫。 如果问题是由未捕获的异常引起的,请阅读关于异常处理的 Apple文章。 具体答案实际上取决于您的代码以及导致崩溃的确切原因,因此我不会推测特定的解决方案。
至于检测服务器错误响应代码(例如404),这更具体到WebKit。 我假设你在iPhone上使用UIWebView ,你可能已经注意到没有一个主要方法返回错误。 这是因为它使用委托模型异步报告进度或错误。 (这是有道理的,因为您不希望您的UI代码受到缓慢加载(或不存在)网页的支配。要获得此类错误的通知,有几个步骤。
UIWebViewDelegate
协议,通常在同一个类中启动网页加载以方便使用。 delegate
属性,因此您可以根据自己的喜好使用uiView.delegate = self
或[uiView setDelegate:self]
。) webView:didFailLoadWithError:
方法。 (通过实现webViewDidFinishLoad:
可以在完成加载时通知您。)这是您包含发生错误时应该发生的事情的逻辑的地方。 我没有看到有关通过此委托方法传回的任何特定错误的内容的任何详细文档,但它是标准的NSError
对象,我建议通过调用其方法来检查内容,例如-localizedDescription
和-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
测试连接非常简单......
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来测试连接不是一个好主意,它不够健壮,无法确定互联网连接是否已关闭,网站是否已关闭或其他网络问题等等,最重要的是它会增加呼叫的开销。作为网络流量。
看看Apple网站上的Reachability演示,它使用正确的方式来确定连接性,包括你是否在wifi等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.