Russian Qt Forum
Ноябрь 23, 2024, 14:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: Стратегия обработки ошибок пользователя с помощью собственных классов исключений  (Прочитано 56219 раз)
vulko
Гость
« Ответ #45 : Октябрь 23, 2014, 08:01 »

to Vulko:
Именно интуиция разработчика позволяет создать универсальное и легковесное решение Веселый
Разработчику без интуиции очень сложно, я бы сказал невозможно жить Улыбающийся

PS почитайте что такое интуиция и с удивлением поймёте, что интуиция есть результат осмысления опыта Улыбающийся

Результатом осмысления опыта, является осмысленный опыт, позволяющий осознанно принимать решения.

А интуиция это нечто совершенно другое.
Есть автоматизм, который приходит с опытом и тренировками, а есть интуиция.

Это только у википедиков интуиция есть результат осмысления опыта. В жизни все по другому.
Записан
vulko
Гость
« Ответ #46 : Октябрь 23, 2014, 08:04 »

Вот про что я говрил в теме "Мать и матика". Очередная тема в которой вы совсем не разбираетесь, но пытетесь делать заключения и даже давать рекомендации.

Но это неудачно (или просто неверно), если интересно объясню почему.
Конечно, будьте любезны обьяснить свои фантазии.


Да... этот профессиАнал в каждой тебе путает людей своими "познаниями". Банить имхо таких надо.
Записан
Bepec
Гость
« Ответ #47 : Октябрь 23, 2014, 08:37 »

Интуиция это и есть наш опыт в неявной форме. Профессиональный строитель забьёт гвоздь 1 ударом. Профессиональный портной сделает закройку парой движений. Профессиональный инженер даже без уровня заценит размер помещения с точностью до 20 см и увидит кривизну. А профессиональный программист при просмотре кода зацепится за несоответствие и закроет баг, не дожидаясь слива в интернете.

Закроем тему интуиции.
Записан
vulko
Гость
« Ответ #48 : Октябрь 23, 2014, 09:23 »

Интуиция это и есть наш опыт в неявной форме. Профессиональный строитель забьёт гвоздь 1 ударом. Профессиональный портной сделает закройку парой движений. Профессиональный инженер даже без уровня заценит размер помещения с точностью до 20 см и увидит кривизну. А профессиональный программист при просмотре кода зацепится за несоответствие и закроет баг, не дожидаясь слива в интернете.

Закроем тему интуиции.

Интуиция, это когда программист не увидев кода скажет где несоответсвие и баг.
А то что ты описал, это опыт.
« Последнее редактирование: Октябрь 23, 2014, 09:26 от vulko » Записан
Bepec
Гость
« Ответ #49 : Октябрь 23, 2014, 10:02 »

Не спорю далее я с вами,
Не мне вас в этом убеждать.
Когда нибудь поймёте сами,
Где интуицию вам взять Веселый
Записан
vulko
Гость
« Ответ #50 : Октябрь 23, 2014, 10:10 »

Не спорю далее я с вами,
Не мне вас в этом убеждать.
Когда нибудь поймёте сами,
Где интуицию вам взять Веселый

Так аргументов у тебя просто нет, потому и не споришь.

Слив засчитан. Такой же балабол как игорс, видимо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #51 : Октябрь 23, 2014, 11:45 »

Конечно, будьте любезны обьяснить свои фантазии.
Какой-то Вы неумелый провокатор Улыбающийся Если, по-Вашему, я не разбираюсь, то зачем же Вам слушать мои объяснения? Я могу удобно соскочить: "если Вы такой умный - Вы и объясните". Ну да ладно, попробую поддержать конструктив, но будете еще фыркать - перестану отвечать

Плохо здесь то что классов наворочено много, а толку никакого. Каждый класс посвящен печати - а это 10 раз поменяется в том же проекте. А про повторное использование и говорить нечего. Правильно планировать так чтобы было удобно обработчику который поймал catch и общается с юзверем. Напр чтение/запись файла. Какие случаи меня интересуют?

1) Файл отсутствует
2) открыт по записи др приложением
3) диск переполнен

Все остальное - какая-то "общая ошибка", все равно мне нечего предпринять. От "испустившего" мне нужен КОД ОШИБКИ, а разбираться с ним я буду сам. Напр в случае "3" возможно "Try Again" (юзер почистит trash и нажмет). Зачем было городить класс на каждый случай - хз. Тот клаcc все равно ничего путного не сделает, т.к. он не знает что нужно - это знает "ловящий"
Записан
Akon
Гость
« Ответ #52 : Октябрь 23, 2014, 11:57 »

Observer: по моему скромному опыту могу сказать следующее (сам адепт исключений):
1. Qt их "не всегда" поддерживает, в том смысле, что когда код Qt работает после вашего (например, вы перекрыли виртуальный метод Qt-класса), он не ожидает исключения. Также яркий пример - исключения их слотов (не допустимы).
2. Стоит разделять ошибки программиста и ошибки пользователя. Для первых предназначен assert, для вторых подходят исключения. В этом свете std::logic_error вообще не нужен, если его назначением считать сигнализацию о логической ошибке (ошибке программиста).
3. Тонкая дифференциация ошибки посредством внушительной иерархии классов исключений, конечно, хорошо, но на практике обычно требуется проверка 2-3 вариантов. В подавляющем большинстве случаев в рамках приложения достаточно std::runtime_error c соответствующим сообщением ошибки для пользователя. Если же вы пишете библиотеку, то хорошим тоном будет использование своего класса исключения для специфичных опреаций вашей библиотеки, с тем чтобы иметь возможность отслеживания источника ошибки.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #53 : Октябрь 23, 2014, 13:03 »

Плохо здесь то что классов наворочено много, а толку никакого. Каждый класс посвящен печати - а это 10 раз поменяется в том же проекте. А про повторное использование и говорить нечего.
Это потому, что ТС не смог объяснить для чего же нужны деревья разных исключений, а вы их начали воспринимать в меру своих знаний.

Я уже писал, что C++ это промышленный язык, для разработки больших систем, поэтому когда мы разрабатываем подсистему, мы хотим сделать ее максимально универсальной, что бы было возможно использовать ее без переделки и дублирования во многих местах системы. Поэтому, мы должны учесть и сообщать исключениями о совершенно разных событиях, которые могут произойти при работе. Мы не знаем, где, когда, кто и как эти события будет обрабатывать.
В одном месте системы при использовании подсистемы Storage мне хватит одной общей ошибки StorageError, в другом месте системы, мне понадобиться детально разобраться, а что же происходит с хранилищем и принять меры. Причем, у меня разные исключения могут обрабатываться не то, что в одной функции (или в методах одного класса), а на разных логических уровнях. Какие-то я обработаю в самом низу (нет хранилища - ничего, попробую другое из доступных), какие-то будут обрабатываться уровнем выше (нет данных в хранилище - я попробую обойтись значениями по умолчанию, если получиться), а если хранилища разрушены - то мне ничего не остается, как завершить процесс с выводом диагностики оператору в функции main.

Мне нужны развесистые деревья исключений (да и не только мне), поэтому не стоит рассказывать, что это какие-то ошибки и нормальные программисты так не сделают. Кто тут у нас решает кто нормальный программист, а кто нет?

Тем более не нужно отвечать за всю отрасль, как вы любите говорить: "Обычно делают так". Вы понятия не имеете как это делается на самом деле. Честнее писать "Что так делаете именно вы", ну собственно как все на форуме и делают.

« Последнее редактирование: Октябрь 23, 2014, 13:06 от Old » Записан
vulko
Гость
« Ответ #54 : Октябрь 23, 2014, 15:15 »

Это потому, что ТС не смог объяснить для чего же нужны деревья разных исключений, а вы их начали воспринимать в меру своих знаний.

...

Мне нужны развесистые деревья исключений (да и не только мне), поэтому не стоит рассказывать, что это какие-то ошибки и нормальные программисты так не сделают. Кто тут у нас решает кто нормальный программист, а кто нет?

Тем более не нужно отвечать за всю отрасль, как вы любите говорить: "Обычно делают так". Вы понятия не имеете как это делается на самом деле. Честнее писать "Что так делаете именно вы", ну собственно как все на форуме и делают.

А зачем объяснять. Достаточно взять для примера жабу.
Наличие четкой и понятной иерархии Exception'ов позволяет понять причину ошибки даже на этапе разработки сразу при её возникновении в 99% случаев без запуска дебага.

Профит.

п.с.
Кстати в соседней ветке "эксперт" игорс предлагал игнорировать мои советы не плодить ненужные классы в низкоуровневом скрытом апи, и всячески поддерживал эту идею.
А тут, где они действительно нужны, совершенно по другому пишет.
Просто фрилансер-недоучка набивает посты...))
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #55 : Октябрь 23, 2014, 19:14 »

.. а вы их начали воспринимать в меру своих знаний.

...не стоит рассказывать,

..Кто тут у нас решает кто нормальный программист, а кто нет?

.. Вы понятия не имеете как это делается на самом деле.
Ну почему из Вас постоянно прет заносчивость и спесь? Так Вы ничего не достигаете и никого не убеждаете, только себе вредите.

Мне нужны развесистые деревья исключений (да и не только мне),
Практически это вся аргументация. "Я так делаю", а кто делает иначе - неграмотный, понятия не имеет...  Улыбающийся Вот давайте сделаем на каждый чих класс исключения, и тогда нам будет гораздо легче поддерживать сложную систему. Да с какой стати? Каждый новый шаг разработки создает новые ситуации - значит новые классы. У меня впечатление что Вы просто злоупотребляете исключениями - тогда да, без "ветвистости" не обойтись.

Ладно, раз пошел переход на личности - тема себя исчерпала (впрочем и была дохленькая). Умолкаю
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #56 : Октябрь 23, 2014, 19:26 »

Ну почему из Вас постоянно прет заносчивость и спесь?
Нее, спесь прет из вас, если вас не одергивать, вы переходите не то что на личности, на открытые оскорбления.

Так Вы ничего не достигаете и никого не убеждаете, только себе вредите.
Это потому, что мне не нужно здесь ничего достигать. В отличие от вас. Улыбающийся

Практически это вся аргументация.
Аргументация была выше. Резюмируя, для того, что бы иметь возможность обрабатывать разные ситуации в разных местах, мне нужны отдельные классы для каждой ситуации. Внимание! Не один класс с кодом ситуации, а именно разные классы.

Ладно, раз пошел переход на личности - тема себя исчерпала (впрочем и была дохленькая). Умолкаю
Ну что, хорошо. Я надеюсь и на личности больше переходить не будете. Улыбающийся

Записан
8Observer8
Гость
« Ответ #57 : Октябрь 24, 2014, 09:18 »

Observer: по моему скромному опыту могу сказать следующее (сам адепт исключений):
1. Qt их "не всегда" поддерживает, в том смысле, что когда код Qt работает после вашего (например, вы перекрыли виртуальный метод Qt-класса), он не ожидает исключения. Также яркий пример - исключения их слотов (не допустимы).
Очень важный момент. Хотелось бы не упустить. Давайте не сразу всё, а немного уточним до этого момента: "вы перекрыли виртуальный метод Qt-класса". Что значит: "Qt работает после вашего исключения"? После моего обработанного исключения? Или необработанного? Вроде после необработанного исключения приложение падает. Не всегда? Я думаю, что в стандарте C++ должен быть ответ, но врядли я найду. Прошу прощения, но Qt и C++ я изучаю (по-настоящему и серьёзно) меньше года и сейчас с боем прорываюсь всеми методами, в том числе и провакационными темами и вопросами. На войне лучше всего узнаёшь людей. Кто действительно дело говорит, а кто самоутверждается за счёт унижения других

"Qt работает после вашего отловленного исключения". Я готов предположить, что имеется ввиду ситуация, когда я перебрасываю исключение на уровень выше. Просто уточните: да или нет. Я обязательно напишу пример. Только помогите разобраться или натолкните на мысль

"Также яркий пример - исключения их слотов (не допустимы). "
Если можно, то чуть подробнее

Покажу, какой я сделал класс "Receiver". А вы напишите, хорош ли он с точки зрения обработки ошибок и в какой ситуации он может быть плох. И какие меры предпринять, чтобы убрать эту "плохость", если она есть. У этого класса есть метод "run()", который запускаем приём данных от COM-порта. Если посылка пришла, то высылается сигнал с данными QByteArray. Этот метод "run()" выбрасывает исключение моего типа "PortError":
Код
C++ (Qt)
class PortError : public std::runtime_error
{
public:
   PortError( const std::string &portName ) : std::runtime_error( "" )
   {
       m_message = "Error: unable to open the port \"" +
               portName + "\"";
   }
   // ...
 

Вот таким образом я вызываю метод "run()"
Код
C++ (Qt)
void MainWindow::runReceiver()
{
   try {
       m_receiver->run();
       connect( m_receiver, SIGNAL( signalReceivedData( QByteArray ) ),
                this, SLOT( slotReceivedData( QByteArray ) ) );
   } catch ( const PortError &e ) {
       QString message( e.what() );
       QMessageBox::information( this, tr( "Error" ), message );
       return;
   } catch( ... ) {
       QString message( "Error: unknown exception" );
       QMessageBox::information( this, tr( "Error" ), message );
       return;
   }
}
« Последнее редактирование: Октябрь 24, 2014, 10:22 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #58 : Октябрь 24, 2014, 09:23 »

Вот класс "Receiver" целиком:

Receiver.h
Код
C++ (Qt)
#ifndef RECEIVER_H
#define RECEIVER_H
 
#include <QObject>
#include <QString>
#include <QSerialPort>
#include <stdexcept>
#include <string>
#include "PortError.h"
 
class Receiver : public QObject {
   Q_OBJECT
public:
 
   Receiver( const QString &portName = QString( "COM2" ),
             QSerialPort::BaudRate baudRate = QSerialPort::Baud9600,
             QSerialPort::DataBits dataBits = QSerialPort::Data8,
             QSerialPort::Parity parity = QSerialPort::NoParity,
             QSerialPort::StopBits stopBits = QSerialPort::OneStop,
             QSerialPort::FlowControl flowControl = QSerialPort::NoFlowControl );
 
   Receiver( const Receiver &receiver );
 
   ~Receiver();
 
   void run( ) throw( PortError );
 
   QString getPortName() const;
   QSerialPort::BaudRate getBaudRate() const;
   QSerialPort::DataBits getDataBist() const;
   QSerialPort::Parity getParity() const;
   QSerialPort::StopBits getStopBits() const;
   QSerialPort::FlowControl getFlowControl() const;
 
signals:
   void signalReceivedData( QByteArray data );
 
private slots:
   void slotReadyRead( );
 
private:
   QSerialPort m_serialPort;
   QString m_portName;
   QSerialPort::BaudRate m_baudRate;
   QSerialPort::DataBits m_dataBits;
   QSerialPort::Parity m_parity;
   QSerialPort::StopBits m_stopBits;
   QSerialPort::FlowControl m_flowControl;
};
 
#endif // RECEIVER_H
 

Receiver.cpp
Код
C++ (Qt)
#include "Receiver.h"
 
Receiver::Receiver( const QString &portName,
                   QSerialPort::BaudRate baudRate,
                   QSerialPort::DataBits dataBits,
                   QSerialPort::Parity parity,
                   QSerialPort::StopBits stopBits,
                   QSerialPort::FlowControl flowControl ) :
   m_portName( portName ),
   m_baudRate( baudRate ),
   m_dataBits( dataBits ),
   m_parity( parity ),
   m_stopBits( stopBits ),
   m_flowControl( flowControl )
{
}
 
Receiver::Receiver( const Receiver &receiver )
{
   this->m_portName = receiver.getPortName();
   this->m_baudRate = receiver.getBaudRate();
   this->m_dataBits = receiver.getDataBist();
   this->m_parity = receiver.getParity();
   this->m_stopBits = receiver.getStopBits();
   this->m_flowControl = receiver.getFlowControl();
}
 
Receiver::~Receiver()
{
   m_serialPort.close();
}
 
void Receiver::run( ) throw( PortError )
{
   m_serialPort.setPortName( m_portName );
 
   if ( !m_serialPort.open( QIODevice::ReadOnly ) ) {
       throw PortError( m_portName.toStdString() );
   }
 
   m_serialPort.setBaudRate( m_baudRate );
   m_serialPort.setDataBits( m_dataBits );
   m_serialPort.setParity( m_parity );
   m_serialPort.setStopBits( m_stopBits );
   m_serialPort.setFlowControl( m_flowControl );
 
   connect( &m_serialPort, SIGNAL( readyRead( ) ),
            this, SLOT( slotReadyRead( ) ) );
}
 
QString Receiver::getPortName() const
{
   return m_portName;
}
 
QSerialPort::BaudRate Receiver::getBaudRate() const
{
   return m_baudRate;
}
 
QSerialPort::DataBits Receiver::getDataBist() const
{
   return m_dataBits;
}
 
QSerialPort::Parity Receiver::getParity() const
{
   return m_parity;
}
 
QSerialPort::StopBits Receiver::getStopBits() const
{
   return m_stopBits;
}
 
QSerialPort::FlowControl Receiver::getFlowControl() const
{
   return m_flowControl;
}
 
void Receiver::slotReadyRead( )
{
   QByteArray data;
   data = m_serialPort.readAll( );
   emit signalReceivedData( data );
}
 

PortError.h
Код
C++ (Qt)
#ifndef PORTERROR_H
#define PORTERROR_H
 
#include <stdexcept>
#include <string>
 
class PortError : public std::runtime_error
{
public:
   PortError( const std::string &portName ) : std::runtime_error( "" )
   {
       m_message = "Error: unable to open the port \"" +
               portName + "\"";
   }
 
   virtual ~PortError() throw()
   {
 
   }
 
   virtual const char *what() const throw()
   {
       return m_message.c_str();
   }
 
   std::string getMessage()
   {
       return m_message;
   }
 
private:
   std::string m_message;
};
 
#endif // PORTERROR_H
 
« Последнее редактирование: Октябрь 24, 2014, 09:31 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #59 : Октябрь 24, 2014, 13:01 »

Я придумал отличный пример из жизни вокруг которого можно построить статью. Займусь переделкой статьи позже. А пока изложу суть

Задача отправлять данные в COM-порт. COM-порт может быть закрыт. Либо он может быть отрыт, но данные в него нельзя отправить

Класс Sender имеет два метода:
- open() - для открытия порта
- void send( const QByteArray &data ) - для отправки данных в порт

Пользователь класса Sender открывает порт так:
Код
C++ (Qt)
   try {
       m_sender->open();
   } catch( const PortOpenError &e ) {
       QString message( e.what() );
       QMessageBox::critical( this, tr( "Error" ), message );
       return;
   }
 

Метод open выбрасывает исключение PortOpenError с текстом:



Метод send выбрасывает два исключения PortOpenError, PortSendDataError. Второе исключение с текстом: Error: unable to send data to the port "COM7" in the fucntion "Sender::send()" Оба исключения наследуются от базового класса PortError, поэтому пользотелю класса Sender достаточно написать один catch для PortError, а второй catch( ... ) (для всех исключений), на всякий случай:

Код
C++ (Qt)
void MainWindow::on_sendButton_clicked()
{
   QByteArray data = "Hello!";
 
   try {
       m_sender->send( data );
   } catch( const PortError &e ) {
       QString message( e.what() );
       QMessageBox::critical( this, tr( "Error" ), message );
       return;
   } catch( ... ) {
       QMessageBox::critical( this, tr( "Error" ),
                              tr ( "Error: unknown exception." ) );
       return;
   }
}
 



Sender.h
Код
C++ (Qt)
#ifndef SENDER_H
#define SENDER_H
 
#include <QSerialPort>
#include <QString>
#include "PortOpenError.h"
#include "PortSendDataError.h"
 
class Sender
{
public:
   Sender( const QString &portName = QString( "COM1" ),
           QSerialPort::BaudRate baudRate = QSerialPort::Baud9600,
           QSerialPort::DataBits dataBits = QSerialPort::Data8,
           QSerialPort::Parity parity = QSerialPort::NoParity,
           QSerialPort::StopBits stopBits = QSerialPort::OneStop,
           QSerialPort::FlowControl flowControl = QSerialPort::NoFlowControl );
 
   Sender( const Sender &sender );
 
   ~Sender();
 
   void setPortName( const QString &portName );
 
   QString getPortName() const;
   QSerialPort::BaudRate getBaudRate() const;
   QSerialPort::DataBits getDataBits() const;
   QSerialPort::Parity getParity() const;
   QSerialPort::StopBits getStopBits() const;
   QSerialPort::FlowControl getFlowControl() const;
 
   void open() throw( PortOpenError );
 
   void send( const QByteArray &data )
   throw( PortOpenError, PortSendDataError );
 
private:
   QSerialPort m_serialPort;
   QString m_portName;
   QSerialPort::BaudRate m_baudRate;
   QSerialPort::DataBits m_dataBits;
   QSerialPort::Parity m_parity;
   QSerialPort::StopBits m_stopBits;
   QSerialPort::FlowControl m_flowControl;
};
 
#endif // SENDER_H
 

Sender.cpp
Код
C++ (Qt)
#include "Sender.h"
 
Sender::Sender( const QString &portName,
               QSerialPort::BaudRate baudRate,
               QSerialPort::DataBits dataBits,
               QSerialPort::Parity parity,
               QSerialPort::StopBits stopBits,
               QSerialPort::FlowControl flowControl ) :
   m_portName( portName ),
   m_baudRate( baudRate ),
   m_dataBits( dataBits ),
   m_parity( parity ),
   m_stopBits( stopBits ),
   m_flowControl( flowControl )
{
}
 
void Sender::open() throw( PortOpenError )
{
   m_serialPort.setPortName( m_portName );
 
   std::string functionName = "Sender::open()";
 
   // Open the port
   if ( !m_serialPort.open( QIODevice::WriteOnly ) ) {
       throw PortOpenError( m_serialPort.portName().toStdString(),
                            functionName );
   }
 
   // Set settings
   m_serialPort.setBaudRate( m_baudRate );
   m_serialPort.setDataBits( m_dataBits );
   m_serialPort.setParity( m_parity );
   m_serialPort.setStopBits( m_stopBits );
   m_serialPort.setFlowControl( m_flowControl );
}
 
void Sender::send( const QByteArray &data )
throw( PortOpenError, PortSendDataError )
{
   std::string functionName = "Sender::send()";
 
   // Check opened or not
   if ( !m_serialPort.isOpen() ) {
       throw PortOpenError( m_serialPort.portName().toStdString(),
                            functionName );
   }
 
   // Write data to the port
   if ( m_serialPort.write( data ) == -1 ) {
       throw PortSendDataError( m_serialPort.portName().toStdString(),
                                functionName );
   }
}
 
Sender::Sender( const Sender &sender )
{
   this->m_portName = sender.getPortName();
   this->m_baudRate = sender.getBaudRate();
   this->m_dataBits = sender.getDataBits();
   this->m_parity = sender.getParity();
   this->m_stopBits = sender.getStopBits();
   this->m_flowControl = sender.getFlowControl();
}
 
Sender::~Sender()
{
   m_serialPort.close();
}
 
void Sender::setPortName( const QString &portName )
{
   m_portName = portName;
}
 
QString Sender::getPortName() const
{
   return m_portName;
}
 
QSerialPort::BaudRate Sender::getBaudRate() const
{
   return m_baudRate;
}
 
QSerialPort::DataBits Sender::getDataBits() const
{
   return m_dataBits;
}
 
QSerialPort::Parity Sender::getParity() const
{
   return m_parity;
}
 
QSerialPort::StopBits Sender::getStopBits() const
{
   return m_stopBits;
}
 
QSerialPort::FlowControl Sender::getFlowControl() const
{
   return m_flowControl;
}
 

PortOpenError.h
Код
C++ (Qt)
#ifndef PORTOPENERROR_H
#define PORTOPENERROR_H
 
#include "PortError.h"
 
class PortOpenError : public PortError
{
public:
   PortOpenError( const std::string &portName,
                  const std::string &functionName ) :
       PortError( portName, functionName )
   {
       m_message = "Error: unable to open the port \"" +
               m_portName + "\"" + " in the function " +
               "\"" + m_functionName + "\"";
   }
};
 
#endif // PORTOPENERROR_H
 

PortSendDataError.h
Код
C++ (Qt)
#ifndef PORTSENDDATAERROR_H
#define PORTSENDDATAERROR_H
 
#include "PortError.h"
 
class PortSendDataError : public PortError
{
public:
   PortSendDataError( const std::string &portName,
                      const std::string &functionName ) :
       PortError( portName, functionName )
   {
       m_message = "Error: unable to send data to the port \"" +
               m_portName + "\"" + " in the function " +
               "\"" + m_functionName + "\"";
   }
};
 
#endif // PORTSENDDATAERROR_H
 

PortError.h
Код
C++ (Qt)
#ifndef PORTERROR_H
#define PORTERROR_H
 
#include <stdexcept>
#include <string>
 
class PortError : public std::runtime_error
{
public:
   PortError( const std::string &portName,
              const std::string &functionName ) : std::runtime_error( "" ),
       m_portName( portName ),
       m_functionName( functionName )
   {
   }
 
   virtual ~PortError() throw()
   {
   }
 
   virtual const char *what() const throw()
   {
       return m_message.c_str();
   }
 
protected:
   std::string m_message;
   std::string m_portName;
   std::string m_functionName;
};
 
#endif // PORTERROR_H
 
« Последнее редактирование: Октябрь 24, 2014, 13:05 от 8Observer8 » Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.686 секунд. Запросов: 23.