Определенные пользователем исключения 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), так что я надеюсь, что я ничего не пропустил.