저희 회사는 GUI 응용 프로그램 용 네트워크 구성 요소 (DLL)를 제공합니다.이 SocketException이 일반 catch 루틴에 의해 포착되지 않는 이유는 무엇입니까?
연결 끊김을 확인하는 타이머를 사용합니다. 그것은 다시 연결하고자하는 경우, 전화 :
internal void timClock_TimerCallback(object state)
{
lock (someLock)
{
// ...
try
{
DoConnect();
}
catch (Exception e)
{
// Log e.Message omitted
// Raise event with e as parameter
ErrorEvent(this, new ErrorEventArgs(e));
DoDisconnect();
}
// ...
}
}
그래서 문제가 SocketException이 슬로우 (그리고 잡힌되지 않음)하는 DoConnect() 루틴의 내부입니다. catch (Exception e)는 모든 예외를 catch해야하지만 SocketException은 잡히지 않아 GUI 응용 프로그램에 표시된다고 가정합니다.
protected void DoConnect()
{
//
client = new TcpClient();
client.NoDelay = true;
// In the following call the SocketException is thrown
client.Connect(endPoint.Address.ToString(), endPoint.Port);
// ... (login stuff)
}
doc은 SocketException이 Exception을 확장한다는 것을 확인했습니다. 나타났다 스택 트레이스는 다음과 같습니다
TcpClient.Connect() -> DoConnect() -> timClock_TimerCallback
는 그래서 예외는 try/catch 블록 외부에서 발생하지 않습니다.
왜 작동하지 않는가?
디버거가 연결되어 있거나 항상 코드가 실행 중일 때만이 문제가 발생합니까? 또한 catch 블록은 try 블록의 모든 예외를 catch하도록 보장되지만 DoConnect가 화재를 처리하고 예외를 발생시키는 것을 잊어 버리면 DoConnect가 반환되고 처리가 계속되어 의도 한 처리기에서 처리되지 않은 예외가 발생합니다. – cfeduke