gpt4 book ai didi

c++ - 如何优雅地处理异常抛出的构造函数?

转载 作者:行者123 更新时间:2023-11-28 01:02:50 25 4
gpt4 key购买 nike

我有时想知道如何处理可以在其构造函数中抛出的对象的构造。我想知道你是怎么做到的。

考虑以下片段。我有一个名为 TCPMessage 的类,它表示我的“服务器”通过 TCP 接收的消息。如果收到的消息无效(即在 TCPMessage 的构造函数中计算的 CRC32 未校验),TCPMessage 的构造函数将抛出。

下面是我的做法。你知道有什么更好的方法吗?我在问,因为它看起来不太优雅。

void TCPConnection::handleRead(
const boost::system::error_code& error,
char* read_buffer
)
{
if (!error) {
TCPMessage* message = NULL; // being verbose here
try {
message = new TCPMessage(read_buffer);
} catch (const char* e) {
std::cerr << "Instatiating TCPMessage: " << e << std::endl;
} catch (...) {
std::cerr << "Instatiating TCPMessage: unknown exception." << std::endl;
}

if (message) {
// if created succesfully
// process the message and delete it
SeekurJrRC::Core::Driver& driver = boost::asio::use_service<SeekurJrRC::Core::Driver>(_io_service);
driver.processMessage(*message);
delete message;
}
}
delete [] read_buffer;
}

哦,是的,我知道比使用 char* read_buffer 并在另一个函数中删除它更好。 shared_ptr 就是这样,我知道。

最佳答案

您的问题不是异常,而是原始指针和缺少 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<SeekurJrRC::Core::Driver>(_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 调用应该包含在 RAII 对象中,而不是在您的用户代码中随意晃动。 delete 调用应该永远是显式的,而是由 RAII 对象中定义的析构函数处理。

然后,如果抛出异常,您的对象将自动销毁并自行清理,并且您不需要过于复杂的“try/catch/check-for-success”舞蹈。如果没有抛出异常,您将正常继续。如果它被抛出,你离开 try block ,你的对象被自动销毁。

请注意,您实际上不再需要 try/catch block 。您使用 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<SeekurJrRC::Core::Driver>(_io_service);
driver.processMessage(message);
}
}

关于c++ - 如何优雅地处理异常抛出的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7926980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com