gpt4 book ai didi

c++ - 这种异常处理方式是好的做法吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:20:49 25 4
gpt4 key购买 nike

您会更改此代码中的任何内容吗?

class LocalPort {
public:
LocalPort(int portNumber) {
innerPort = new ACMEPort(portNumber);
}

void Open() {
try {
innerPort->Open();
}
catch (DeviceResponseException& e) {
throw PortDeviceFailure(e);
}
catch (ATM1212UnlockedException& e) {
throw PortDeviceFailure(e);
}
catch (GMXError& e) {
throw PortDeviceFailure(e);
}
}
private:
ACMEPort* innerPort;
};

/////////

try {
LocalPort* port = new LocalPort(12);
port->Open();
}
catch (bad_alloc& e) {
ReportError(e);
logger.Log("Wyjątek alokacji pamięci", e);
delete port;
}
catch (PortDeviceFailure& e) {
ReportError(e);
logger.Log(e.getMessage(), e);
delete port;
}

我试图在上面做的是让代码在下面看起来和表现得更好。

try {
ACMEPort* port = new ACMEPort(12);
port->Open();
}
catch (bad_alloc& e) {
ReportPortError(e);
logger.Log("Wyjątek alokacji pamięci", e);
delete port;
}
catch (DeviceReponseException& e) {
ReportPortError(e);
logger.Log("Wyjątek odpowiedzi urządzenia", e);
delete port;
}
catch (ATM1212UnlockedException& e) {
ReportPortError(e);
logger.Log("Wyjątek odblokowania", e);
delete port;
}
catch (GMXError& e) {
ReportPortError(e);
logger.Log("Wyjątek odpowiedzi urządzenia");
delete port;
}
catch (...) {
ReportPortError(0);
logger.Log("Wyjątek nieznanego pochodzenia");
delete port;
}

我成功了吗?第一个比第二个好吗?你怎么看?

最佳答案

您的异常类似乎设计得很糟糕。你为什么不简单地添加一个成员函数 getMessage 到你的异常层次结构(最好在基类中,你所有的异常都派生自 - std::exception 提供了返回错误消息的方法 what)。这样,您可以简单地在一个语句中捕获所有异常,并以相同的方式处理它们。

class DeviceResponseException : public std::runtime_error {
public:
DeviceResponseException() : std::runtime_error("Some error message") {}
};

class ATM1212UnlockedException : public std::runtime_error {
public:
ATM1212UnlockedException() : std::runtime_error("Some other error message") {}
};

然后在您的代码中,您可以这样做:

try {
std::auto_ptr<ACMEPort> port(new ACMEPort(12));
port->Open();
}
catch( std::runtime_error & e) {
ReportPortError(e);
logger.Log(e.what(), e);
}

由于您的异常类都派生自 std::runtime_error,因此此 catch 子句会捕获所有异常类。这没关系,因为所有情况下的处理都是相同的。如果您有需要特殊处理的特定异常,您可以添加额外的 catch 子句。

此外,您应该使用 std::auto_ptrboost::scoped_ptr 或那种东西。了解 RAII .

关于c++ - 这种异常处理方式是好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897500/

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