Определенные пользователем исключения CORBA дали мне ошибки после компиляции

У меня есть некоторые проблемы с моим собственным, определяемым пользователем исключением в CORBA. Вот мой очень простой код:

interface Interfface
{
    exception myOwnException {};

    void ffunction(in double arg) raises (myOwnException);
};

#include "Interfface.hh"

class Implementation : public POA_Interfface
{
    public :
        virtual void ffunction(double arg) throw (myOwnException);
};

#include "Implementation.h"

void Implementation::ffunction(double arg) throw (myOwnException)
{   
    arg ++;    
    throw (myOwnException);
}

И когда я скомпилировал Внедрение.cpp, он дал мне несколько ошибок ( http://pastie.org/private/a22ikk09zkm9tqywn37w):

Implementation.cpp: In member function ‘virtual void Implementation::ffunction(double)’:
Implementation.cpp:5: error: ‘myOwnException’ was not declared in this scope
In file included from Implementation.cpp:1:
Implementation.h:6: error: expected type-specifier before ‘myOwnException’
Implementation.h:6: error: expected ‘)’ before ‘myOwnException’
Implementation.h:6: error: expected ‘;’ before ‘myOwnException’
Implementation.cpp:3: error: expected type-specifier before ‘myOwnException’
Implementation.cpp:3: error: expected ‘)’ before ‘myOwnException’
Implementation.cpp:3: error: expected initializer before ‘myOwnException’

Что не так с этим кодом? И еще один вопрос: как я могу делать то же самое в Java?

Вот мой код: http://speedy.sh/F5utX/user-defined-exception.tar Я сделал то же самое в Java (код также в пользовательском-exception.tar), но код Java дал мне это:

Note: InterffacePOA.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

1 ответ

Решение

Вы должны создать новый экземпляр типа исключения, например:

throw myOwnException();

Вам также может понадобиться определить пространство имен:

throw Interfface::myOwnException();

Кстати, объявления throw действительно не имеют никакого полезного эффекта в большинстве (прочитанных "всех") реализаций компилятора и устарели в C++11. Я знаю, что они, вероятно, были сгенерированы здесь, но это все еще полезно знать. Я считаю, что на практике эти декларации, как правило, перестают быть точными с последующими изменениями источника. Не перетаскивайте их в свои файлы реализации. С другой стороны, вы используете неинформативные имена переменных и типов и не имеете согласованного соглашения об именах.

РЕДАКТИРОВАТЬ: Как сказал Джонни Виллемсен, вы можете добавить членов к исключениям, как это:

exception myOwnException {
    string reason;
};

Каждый член исключения будет представлен как член открытого класса. Будут сгенерированы необходимые конструкторы, поэтому вы можете выдать такое исключение следующим образом:

throw Interfface::myOwnException("Wrong polarity!");

Когда генерируется исключение, если оно не перехватывается локально, оно сериализуется и передается клиенту (удаленному вызывающему процессу). Там он будет десериализован, так что вы можете поймать его и получить доступ к его членам:

try
{
    server->ffunction(0);
}
catch(const Interfface::myOwnException &ex)
{
    std::cout << ex.reason;
}

В C++ вы обычно ловите исключения по константной ссылке (это также зависит от того, как оно было сгенерировано). Я пишу это по памяти (материал CORBA), так что я надеюсь, что я ничего не пропустил.

Другие вопросы по тегам