Michelle,

Certainly Cach� lacks a proper exception mechanism. However the typical way in which you force a runtime error is to set a value to the $ECODE variable. Within Cach�, this would attempt to execute an error trap if it's set, otherwise it would stop the current process.

When you use this functionality within a method from the Java projection, the exception CacheServerException is thrown and you could catch that.

Note that, since control is interrupted, it may be a good idea to clean up within the Cach� method before setting the $Ecode value. In Java we usually do that via a catch or a finally block, but neither of those exist in Cach� and since control is transferred back to the Java side when the error occurs, it's better to clean up any resources (e.g. release locks, close objects) before "throwing" the error.

I've put together a very contrived example to reproduce this behaviour - simply cut'n-paste the Cach� class below and put the Java main() method in the same class or in another to test the example.

The main problem I see with this approach is that Cach� will return "<ECODETRAP>" as the error code for the operation - what typically happens in the Cach� side is that you set $Ecode to a descriptive message, then within your error trap if $ZERROR contains "<ECODETRAP" you can pick the message from $Ecode. However in my tests the getMessage() method of the thrown CacheServerException only contains the "cryptic" <ECODETRAP> string. I will look into it within Eclipse later to see if it's possible to get more information from it.

HTH,

Ram�n
-----------------------------------------------------------------

Class Test.JavaEx Extends %RegisteredObject [ ProcedureBlock ]
{
        Projection prj As %Projection.Java;
        
        Method CreateResultSet(dummy As %Integer) As %Library.ResultSet
        {
                Set result = ##class(%Library.ResultSet).%New()
                Set $Ecode = "Forced exception"
                Quit result
        }
}

-----------------------------------------------------------------
public static void main( String[] args ) throws Exception {
Database conn = CacheDatabase.getDatabase( "jdbc:Cache://localhost:1972/USER" );
JavaEx ex = new JavaEx( conn );
ex.CreateResultSet( new Integer( 0 ) );
conn.close();
}




Reply via email to