2011-09-19 5 views
0

:빈 try try catch로 모든 것을 래핑하지 않고 스트림 데이터를 읽는 더 나은 방법? 현재이 같은 일을

try 
{ 
    while ((bytesRead = clientStream.Read(data, 0, data.Length)) != 0) 
    { 
     string message = Encoding.ASCII.GetString(data, 0, bytesRead) + Environment.NewLine; 

     txtLog.Invoke(c => c.AppendText(message)); 
    } 
} 
catch 
{ 

} 
작동

하지만 꽤 추한.

나는 사람들이 모든 예외를 잡아 내지 말고 예외가 발생할 때 적어도 뭔가를한다고 말할 것입니다. 그러나 저는 서버 응용 프로그램을 작성하고 있습니다. 사용자가 갑자기 연결을 끊으면 문제가되지 않습니다. 그것은 기록 될 필요가 없습니다. 또한, 나는 프로그램이 충돌하는 것을 결코 원하지 않으므로 모든 예외를 실제로 잡는 것이 그렇게 나쁘다. 프로그램은 여전히 ​​복구 할 수 있습니다. while 루프가 끝나면이 코드가 실행되고 모든 것이 정상입니다. 오른쪽?이 괜찮 그렇지 않은 경우, 갑자기 분리 사용자 또는 읽기 오류의 다른 형태를 처리 할 수있는 더 좋은 방법은 무엇 인 경우

string clientIdentifier = tcpClient.Client.RemoteEndPoint.ToString(); 

bool clientRemoved = clients.TryRemove(clientIdentifier); 

if (clientRemoved) 
{ 
    listUsers.Invoke(c => c.Items.Remove(clientIdentifier)); 
} 

tcpClient.Close(); 

정말 특정 질문이지만 궁금 이상을 요구하지?

답변

0

특정 질문을하지는 않지만이게 괜찮은지 궁금한 점이 있다면 사용자를 갑자기 연결 해제하거나 다른 형태의 읽기 오류를 처리하는 더 좋은 방법은 무엇일까요?

캐치 IOException 다른 사람은 잡히지 않습니다 (나머지는 코드에 버그를 나타내며 삼키고 싶지 않습니다). Exception.InnerException은 어떤 일이 발생했는지 알려주고 내부 예외가 SocketException 인 경우 SocketException.ErrorCode을 검사하여 세부 정보를 얻을 수 있습니다.

NetworkStream.CanRead을 확인하면 스트림이 읽을 수 있는지 확인할 수 있습니다 (예 : NetworkStream.CanReadtrue을 반환하지만 사용자가 읽기 전에 사용자가 갑자기 닫을 수 있음). NetworkStream.Read을 여전히 try/catch에 넣어야하지만 NetworkStream.CanRead이 거짓 인 경우 예외가 발생하지 않도록 할 수 있습니다.

0

대신 try 블록을 사용하십시오. 블록 사용 블록을 사용할 수 있습니다. 하지만 try try catch를 명시 적으로 사용하지 않으면 사용 블록 내에서 예외를 얻을 수 없습니다. 잡기 예외는 실제로 나쁘지는 않지만 아무것도하지 않고 삼키는 것이 좋지 않습니다.

하지만 코드에 따라 catch를 사용하는 것보다는 모든 객체 스트림을 닫으려면 finally 블록을 사용하십시오. 그래서 당신의 앱은 안전하고 건전합니다.

관련 문제