2011-06-06 59 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