ios开发之处理流错误

译自:Handling Stream Errors

通常情况下,特别是与sockets相关联时streams会遇到错误从而不能进一步处理stream data。一般情况下,错误提示了在流的一端缺失了东西,比如说远程主机的crash,正在使用的文件被删除等等。在此情况下,客户端能够做的就是将这些错误提示给用户,尽管一个stream object在上报错误之后,在它关闭之前仍然可以查询它的状态,但是它不能再用于写或者读操作。

当错误发生时,NSStream和NSOutputStream类通过以下几种方式发起通知:

1,如果stream object布置在一个run loop上,那么该对象通过stream:handleEvent:消息向其delegate发送NSStreamEventErrorOccurred事件发起通知

2,任何时候客户端可以向stream object发送streamStatus消息查询是否会返回NSStreamStatusError

3,如果你尝试通过write:maxLength:消息向NSOutputStream对象写数据时,该消息返回值 -1,这时发生一个写错误

一旦你检查到stream object发生错误,你可以向stream object发送streamError消息获得更加详细的信息(是一个NSError对象),然后将该错误信息通知给用户。下面的代码是布置在一个run loop上的stream object的delegate处理错误的方法:

- (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]; // modal delegate releases
            [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 ....
    }
}

对于某些错误,除了通知用户之后你可以做更多的工作。比如,如果你在进行socket连接的时候设置了SSL 安全等级,但是远程的主机没有设定,该stream object会发送一个错误,你可以释放之前的stream object并且创建一个新的不安全的套接字连接。

你可能感兴趣的:(ios,object,Stream,socket,Crash,Sockets)