如何在iphone中使用Try………Catch查找Internet网络错误?

如何在iphone中使用Try………Catch查找Internet网络错误?,iphone,Iphone,我正在开发一个应用程序,在其中调用iphone上的web服务。我想实现Try…Catch在该代码中捕获internet和GPRS连接错误。代码如下: NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setURL:[NSURL URLWithString:mainURL5]]; [request setHTTPMethod:@"POST"]; NSHTTPURLRe

我正在开发一个应用程序,在其中调用iphone上的web服务。我想实现Try…Catch在该代码中捕获internet和GPRS连接错误。代码如下:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:mainURL5]];
[request setHTTPMethod:@"POST"];

NSHTTPURLResponse* urlResponse = nil;  
NSError *error = [[[NSError alloc] init] autorelease];  
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
result5 = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];  
我用的是Try…catch,但它不起作用,代码如下

@try
{
//prepar request
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:mainURL5]];
[request setHTTPMethod:@"POST"];

NSHTTPURLResponse* urlResponse = nil;  
NSError *error = [[[NSError alloc] init] autorelease];  
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
result5 = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
}
@catch(NSException * e)
{
    [clsMessageBox ShowMessageOK:@"some text" :[e reason]];
}

在Objective-C中,异常与错误不同。试试这个:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:mainURL5]];
[request setHTTPMethod:@"POST"];

NSHTTPURLResponse* urlResponse = nil;  
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
if (error) {
    [clsMessageBox ShowMessageOK:@"ERROR" :[error description]];
} else {
    result5 = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
}

编辑:另外,除非您是从后台线程执行此操作,否则不建议使用
-[NSURLConnection sendSynchronousRequest:returningResponse:error:

在Objective-C中,异常与错误不同。试试这个:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:mainURL5]];
[request setHTTPMethod:@"POST"];

NSHTTPURLResponse* urlResponse = nil;  
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];  
if (error) {
    [clsMessageBox ShowMessageOK:@"ERROR" :[error description]];
} else {
    result5 = [[NSMutableString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
}

编辑:另外,除非您是从后台线程执行此操作,否则不建议使用
-[NSURLConnection sendSynchronousRequest:returningResponse:error:

此方法不会引发异常,因此使用try/catch对您没有帮助。方法返回后,如果
responseData
nil
,则出现错误,应检查
error
的值。您还可能有HTTP错误,这将是响应数据的一部分。此外,没有理由初始化某个空错误对象的
error
。只需将其初始化为
nil

因此:


此方法不会引发异常,因此使用try/catch对您没有帮助。方法返回后,如果
responseData
nil
,则出现错误,应检查
error
的值。您还可能有HTTP错误,这将是响应数据的一部分。此外,没有理由初始化某个空错误对象的
error
。只需将其初始化为
nil

因此:


你不应该依赖于检查错误。即使发生错误,它也可能不是零。该方法在出错时返回nil,因此如果该方法返回nil,那么您只需查看error变量中的内容。事实并非如此,该方法在其他情况下也返回
nil
(例如HTTP
204 No Content
)<将为操作系统/网络故障设置代码>错误。应用程序还应该检查
returningResponse
,看看服务器发送了什么类型的响应,如果这很重要的话。事实上,这是真的。如果函数成功,则错误状态是未定义的,并且可以对其进行设置(事实上,对于CoreData,它通常为/is/set)。此方法在成功时从不返回nil。当您得到204响应时,该方法返回一个长度为0而不是零的NSData对象。您不应该依赖于错误检查。即使发生错误,它也可能不是零。该方法在出错时返回nil,因此如果该方法返回nil,那么您只需查看error变量中的内容。事实并非如此,该方法在其他情况下也返回
nil
(例如HTTP
204 No Content
)<将为操作系统/网络故障设置代码>错误。应用程序还应该检查
returningResponse
,看看服务器发送了什么类型的响应,如果这很重要的话。事实上,这是真的。如果函数成功,则错误状态是未定义的,并且可以对其进行设置(事实上,对于CoreData,它通常为/is/set)。此方法在成功时从不返回nil。当您得到204响应时,该方法返回一个长度为0而不是nil的NSData对象。