Exceptions are always caught by reference using the _var types.
System exceptions must be caught by SystemException_var:
// ok
try {
...
mico_throw (CORBA::UNKNOWN());
...
} catch (CORBA::SystemException_var &ex) {
...
}
// wrong
try {
...
mico_throw (CORBA::UNKNOWN());
...
} catch (CORBA::UNKNOWN_var &ex) {
...
}
// wrong
try {
...
mico_throw (CORBA::UNKNOWN());
...
} catch (CORBA::Exception_var &ex) {
...
}
Sometimes it is necessary to know exactly which system exception has been thrown:
// ok
try {
...
mico_throw (CORBA::UNKNOWN());
...
} catch (CORBA::SystemException_var &sys_ex) {
if (CORBA::UNKNOWN *ukn_ex = CORBA::UNKNOWN::_narrow (sys_ex)) {
// something1
} else {
// something2
}
}
// wrong
try {
...
} catch (CORBA::UNKNOWN_var &ukn_ex) {
// something1
} catch (CORBA::SystemException_var &other_ex) {
// something2
}
In contrast to system exceptions a user exception X must be caught by
X_var (i.e., not by UserException_var):
// ok
try {
...
mico_throw (SomeExcept());
...
} catch (SomeExcept_var &some_ex) {
...
}
// wrong
try {
...
mico_throw (SomeExcept());
...
} catch (CORBA::UserException_var &usr_ex) {
...
}
// wrong
try {
...
mico_throw (SomeExcept());
...
} catch (CORBA::Exception_var &ex) {
...
}
If an exception is thrown but not caught MICO will print out a short description of the exception and terminate the process. On systems where g++ does not support exception handling throwing an exception will always result in such a message and termination of the process.