Похоже, у вас плохо разработаны классы исключений.Почему бы вам просто не добавить функцию-член 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
-классы.
Кроме того, вместо вызова delete port
в обработчике исключений, вы должны использовать std::auto_ptr
или boost::scoped_ptr
иличто-то в этом роде.Читайте о RAII .