Обработка потоковых ошибок
Иногда, и особенно с сокетами, потоки могут столкнуться с ошибками, предотвращающими последующую обработку потоковых данных. Обычно ошибки указывают отсутствие чего-то в одном конце потока, такого как катастрофический отказ удаленного узла или удаление передаваемого потоком файла. Существует немного, который может сделать клиент потока, когда большинство ошибок происходит кроме отчета ошибка пользователю. Несмотря на то, что потоковый объект, сообщивший об ошибке, может быть запрошен для состояния, прежде чем это будет закрыто, это не может быть снова использовано для операций чтения или операций записи.
NSStream
и NSOutputStream
если ошибка произошла несколькими способами, классы сообщают Вам:
Если потоковый объект планируется на цикл выполнения, объектные отчеты a
NSStreamEventErrorOccurred
событие его делегату в astream:handleEvent:
сообщение.В любое время клиент может отправить a
streamStatus
обменивайтесь сообщениями к потоковому объекту и посмотрите, возвращается ли онNSStreamStatusError
.При попытке записать в
NSOutputStream
объект путем отправки егоwrite:maxLength:
и это возвращается-1, ошибка при записи произошла.
Как только Вы решили, что потоковый объект столкнулся с ошибкой, можно запросить объект с a streamError
сообщение для получения большей информации об ошибке (в форме NSError
объект). Затем, сообщите пользователю об ошибке. Перечисление 1 показывает, как делегат выполнения запланированный на цикл потоковый объект мог бы обработать ошибку.
Перечисление 1 , Обрабатывающее потоковые ошибки
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { |
NSLog(@"stream:handleEvent: is invoked..."); |
switch(eventCode) { |
case NSStreamEventErrorOccurred: |
{ |
NSError *theError = [stream streamError]; |
NSAlert *theAlert = [[NSAlert alloc] init]; |
[theAlert setMessageText:@"Error reading stream!"]; |
[theAlert setInformativeText:[NSString stringWithFormat:@"Error %i: %@", |
[theError code], [theError localizedDescription]]]; |
[theAlert addButtonWithTitle:@"OK"]; |
[theAlert beginSheetModalForWindow:[NSApp mainWindow] |
modalDelegate:self |
didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) |
contextInfo:nil]; |
[stream close]; |
[stream release]; |
break; |
} |
// continued .... |
} |
} |