2010-03-12 2 views
0

Я разрабатываю приложение, в котором я называю веб-службы на iphone. Я хочу осуществить Попробуйте ....... Поймать в этом коде для ловли Интернет и GPRS-код подключения error.The как следовать,Как найти внутреннюю сетевую ошибку, используя Try .......... Поймать в iphone?

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 
{ 
//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]]; 
} 

ответ

3

Этот метод не генерирует исключений, поэтому использование try/catch не поможет вам. После возврата метода, если responseData - nil, у вас есть ошибка, и вы должны проверить значение error. У вас также может быть ошибка HTTP, которая будет частью данных ответа. Кроме того, нет причин для инициализации error для некоторого пустого объекта ошибки. Просто инициализируйте его до nil.

Итак:

NSError* error = nil; 
NSData* responseData = nil; 
if(!(responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error])) { 
    NSLog(@"Oops: %@", error); 
} 
0

В исключениях 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:] является не рекомендуется.

+0

Вы не должны полагаться на проверку ошибок. Это может быть не ноль, даже если произошла ошибка. Метод возвращает nil при ошибке, поэтому, если метод возвращает nil, только тогда вы должны посмотреть, что находится в переменной ошибки. –

+0

Это неверно, метод также возвращает 'nil' в других ситуациях (например, HTTP' 204 No Content'). 'error' будет установлен для сбоев ОС/сети. Приложения также должны проверять «returnResponse», чтобы узнать, какой тип ответа сервер отправил, если это имеет значение. – rpetrich

+0

Собственно, это правда. Состояние ошибки не определено, если функция завершается успешно, и ее можно установить (на самом деле, для CoreData она часто/установлена ​​/ установлена). Этот метод НИКОГДА не возвращает ниль на успех. Когда вы получаете ответ 204, метод возвращает объект NSData с длиной 0, а не нулем. –

Смежные вопросы