2011-06-06 62 views
6

目前,我正在使用Boost Asio通過TCP連接到服務器。如何避免程序退出後連接拒絕與升壓Asio和C/C++

我使用一個條件案例來決定應用程序是否必須啓動或不與服務器建立連接;它的偉大工程,但問題是,如果我嘗試連接到服務器時,服務器關閉,然後應用程序崩潰給這個錯誤:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' 
    what(): Connection refused 

這是我使用的代碼:

case CONNECTION: 
// Connect to the server 
using boost::asio::ip::tcp; 
boost::asio::io_service io_service; 
tcp::resolver resolver(io_service); 
tcp::resolver::query query(tcp::v4(), server, boost::lexical_cast<string>(porta)); 
tcp::resolver::iterator iterator = resolver.resolve(query); 
tcp::socket s(io_service); 
s.connect(*iterator); 

我想保持活動我的應用程序的正常行爲,只提示有關連接失敗的警告。

我該如何處理這個異常?

回答

6

根據文檔here,發生故障connect投出boost::system::system_error。因此,您需要將代碼包裝在try...catch塊中,並捕獲上述異常。或者,如果您不想使用例外情況,則可以使用描述爲here的其他過載,該錯誤​​會在返回錯誤時返回錯誤代碼。

+0

+1提到兩種方式來處理錯誤。 – 2011-06-06 13:05:27

7

您應該使用try ... catch塊。他們以這種方式工作:

try 
{ 
    s.connect(*iterator); 
} 
catch (boost::system::system_error const& e) 
{ 
    std::cout << "Warning: could not connect : " << e.what() << std::endl; 
} 
+0

當你只能捕捉到所期望的東西時,你爲什麼要捕捉**所有**? – ereOn 2011-06-06 11:36:01

+1

也許是一個選擇不好的例子。從你的回答中不清楚OP是否應該捕獲'boost :: system :: system_error'。初學者閱讀你的答案可能甚至認爲這是一個很好的做法,「抓住一切」,而這實際上是一件可怕的事情。 – ereOn 2011-06-06 11:39:23

+0

如果您發現所有例外,那麼您是如何決定「無法連接」的?可能是你「無法分配內存」?或「引用無效的內存地址」或「傳遞無效的參數(對某個地方某些功能)」? – 2011-06-06 11:39:25