diff options
author | Vegard Storheil Eriksen <zyp@jvnv.net> | 2010-11-24 23:03:52 +0100 |
---|---|---|
committer | Vegard Storheil Eriksen <zyp@jvnv.net> | 2010-11-24 23:03:52 +0100 |
commit | 8deb1c3ad57bb0a84b5821cbe176438bced74eba (patch) | |
tree | db2e06d0f1f81a0268c194263f1e30280200cdee /common | |
parent | 6a618d45345026f9ddf81f241be43c0cfd95e94a (diff) |
Added error handling around connections.
Diffstat (limited to 'common')
-rw-r--r-- | common/connectionbase.cpp | 15 | ||||
-rw-r--r-- | common/connectionbase.h | 5 |
2 files changed, 15 insertions, 5 deletions
diff --git a/common/connectionbase.cpp b/common/connectionbase.cpp index 165614f..a113e6a 100644 --- a/common/connectionbase.cpp +++ b/common/connectionbase.cpp @@ -1,6 +1,6 @@ #include "connectionbase.h" -#include <stdexcept> +#include <exception> #include <iostream> @@ -11,7 +11,7 @@ void ConnectionBase::start_recv() { void ConnectionBase::got_data(uint8_t* data, std::size_t bytes) { if(pending_size == 0) { if(bytes != 4) { - throw std::runtime_error("Deserialization header error."); + error("Deserialization header error."); } uint16_t* header = (uint16_t*)data; @@ -29,7 +29,7 @@ void ConnectionBase::got_data(uint8_t* data, std::size_t bytes) { if(bytes != pending_size) { std::cout << "Bytes: " << bytes << " Pending size: " << pending_size << std::endl; - throw std::runtime_error("Deserialization attempted with incomplete data."); + error("Deserialization attempted with incomplete data."); // TODO: Calling got_data() with incomplete data should be allowed. } @@ -75,11 +75,16 @@ void ConnectionBase::got_data(uint8_t* data, std::size_t bytes) { break; default: - throw std::runtime_error("Deserialization attempted on unknown message type."); + error("Deserialization attempted on unknown message type."); } if(bytes) { - m->deserialize(data, bytes); + try { + m->deserialize(data, bytes); + + } catch(std::exception& e) { + error(std::string("Deserialization failed: ") + e.what()); + } } got_message(m); diff --git a/common/connectionbase.h b/common/connectionbase.h index 4604896..f86a9ab 100644 --- a/common/connectionbase.h +++ b/common/connectionbase.h @@ -3,6 +3,7 @@ #include <stdint.h> #include <cstdlib> +#include <string> #include "message.h" @@ -33,6 +34,10 @@ class ConnectionBase { //! \param msg Received message. virtual void got_message(const Message::p& msg) = 0; + //! Called upon error (lost connection or failed deserialization). + //! \param msg Error message. + virtual void error(const std::string& msg) = 0; + public: ConnectionBase(); virtual ~ConnectionBase(); |