我公司爲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();
}
// ...
}
}
所以,問題是,在DoConnect()例程SocketException拋出(而不是抓)的內部。我會假設catch(Exception e)應該捕獲所有的異常,但是不知何故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)
}
該文檔證實SocketException擴展了Exception。 是出現了堆棧跟蹤是:
TcpClient.Connect() -> DoConnect() -> timClock_TimerCallback
所以沒有拋出異常的try/catch塊之外。
任何想法,爲什麼它不工作?
只有在連接了調試器或始終運行代碼時纔會出現此問題嗎?此外catch還可以捕獲try塊中的所有異常 - 但是如果您的DoConnect執行了一次fire並忘記了該異常,則DoConnect將返回並且處理將繼續導致異常被您的預期處理程序取消處理。 – cfeduke 2010-02-08 15:42:13