あなたの問題は例外ではなく、生のポインタとRAIIの欠如です。
あなたのコードを少し消毒する:
void TCPConnection::handleRead(
const boost::system::error_code& error,
char* read_buffer
)
{
if (!error) {
try {
TCPMessage message(read_buffer);
SeekurJrRC::Core::Driver& driver = boost::asio::use_service(_io_service);
driver.processMessage(message);
} catch (const char* e) {
std::cerr << "Instatiating TCPMessage: " << e << std::endl;
} catch (...) {
std::cerr << "Instatiating TCPMessage: unknown exception." << std::endl;
}
}
}
new
calls should be wrapped in RAII objects, not dangle around freely in your user code. delete
calls should never be explicit, but instead be handled by the destructors defined in your RAII objects.
例外がスローされた場合、オブジェクトは自動的に破棄され、クリーンアップされ、過度に複雑な "try/catch/check-for-success"ダンスは必要ありません。例外がスローされなかった場合は、正常に続行されます。投げられた場合は、 try
ブロックを離れ、オブジェクトは自動的に破棄されます。
ここでは、 try
/ catch
ブロックを実際に必要する必要はありません。 catch
を使用する唯一の方法は、エラーメッセージを出力することです。プログラムフローやリソースリークの防止には必要ありません。通常は、意味のあるところでエラーを処理します。恐らくそれはコールツリーのほんの少し上にあります。ここでは、失敗した読み込みについて何をすべきかを知っています。このレベルでは、エラーが発生したことを示すために例外をエスケープさせる方が理にかなっています。
void TCPConnection::handleRead(
const boost::system::error_code& error,
char* read_buffer
)
{
if (!error) {
TCPMessage message(read_buffer);
SeekurJrRC::Core::Driver& driver = boost::asio::use_service(_io_service);
driver.processMessage(message);
}
}