2010-12-05 71 views
1

我有以下代碼try/catch塊失敗和應用程序崩潰

try { 
    clientService.sin_family = AF_INET; 
    clientService.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); //fails 
    clientService.sin_port = htons(port); 
    } 

catch (...) { return; } 

如果我禁用我的網絡適配器,我的應用程序崩潰。這種錯誤是否應該被捕獲?

回答

1

這只是一個猜測,但你可能沒有檢查hostEntrygethostbyname返回後,你有一個NULL指針。在使用它之前檢查它是否爲空。

1

如果您沒有設置VS,那麼它將不會捕獲SEH異常(如訪問衝突),儘管可以將其設置爲捕獲catch(...)塊中的SEH異常。這可能只是一個更好的主意,而不是首先展示問題,SEH例外通常表明您做了嚴重錯誤的事情。

+0

所以在這種情況下,我該如何檢查如果我沒有啓用網絡適配器,所以我沒有得到SEH異常? – coolface 2010-12-05 21:18:37

+0

+1 - 你需要這樣做,以及確保代碼不僅僅是爲C++異常設置的。 – 2010-12-05 21:18:38

+0

@coolface:我不知道。詢問MSDN。 – Puppy 2010-12-05 21:19:26

1

這裏很難在沒有更多代碼的情況下得出一個確定的結論,但我想象由於網絡不可用,hostEntry或其h_addr_list字段是NULL。您的代碼只處理C++異常,您需要將其改進爲handle structured exceptions(例如訪問衝突),以便達到您的期望。 (不管是否有任何異常處理增強功能,您都應該這麼做),最好只修復代碼,以免在gethostbyaddr上的較早錯誤之後使用無效指針。