2012-05-05 3 views
3

У меня есть некоторые проблемы с моим собственным, определяемым пользователем исключением в 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); 
} 

И когда я собирал Implementation.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?

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

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

ответ

2

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

throw myOwnException(); 

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

throw Interfface::myOwnException(); 

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

EDIT: Как сказал Джонни Willemsen, вы можете добавить пользователей в исключение, как это:

exception myOwnException { 
    string reason; 
}; 

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

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

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

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

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

+1

Полезно знать;) Я удалил объявления «throw» в своих файлах * .h и * .cpp. Хотя throw myOwnException(); дал мне это: || Implement.cpp: В функции-члене «virtual void Implementation :: ffunction (double)»: . Реализация.cpp: 6: ошибка: «myOwnException» не было объявлено в этой области || этот код: throw Interfface :: myOwnException(); помог мне. Поэтому я могу сказать, что проблема решена. Большое большое спасибо! :) –

+0

Еще один вопрос: как я могу определить свой idl-интерфейс, чтобы получить sth, как это: || Строковая причина = «Sth пошло не так: P»;/* кусок кода * /; throw myOwnException (причина); || Вы знаете? –

+0

Просто добавьте член в объявление исключения.Например, string cause ;. –

 Смежные вопросы

  • Нет связанных вопросов^_^