Argh. Java 6 Rhino does the same thing (does not publish the file name / line number / etc via ScriptingException methods) with sun.org.mozilla.javascript.internal.EvaluatorException and who knows how many other exceptions.
The only reasonable way I can think with is to use reflection. Here is my solution.
void handleScriptingException(ScriptingException se) { final Throwable t1 = se.getCause(); String lineSource = null; String filename = null; Integer lineNumber = null; if (hasGetterMethod(t1, "sourceName")) { lineNumber = getProperty(t1, "lineNumber", Integer.class); filename = getProperty(t1, "sourceName", String.class); lineSource = getProperty(t1, "lineSource", String.class); } else { filename = se.getFileName(); lineNumber = se.getLineNumber(); } } static private Method getGetterMethod(Object object, String propertyName) { String methodName = "get"+getBeanSuffix(propertyName); try { Class<?> cl = object.getClass(); return cl.getMethod(methodName); } catch (NoSuchMethodException e) { return null; } } static private String getBeanSuffix(String propertyName) { return propertyName.substring(0,1).toUpperCase() +propertyName.substring(1); } static private boolean hasGetterMethod(Object object, String propertyName) { return getGetterMethod(object, propertyName) != null; } static private <T> T getProperty(Object object, String propertyName, Class<T> cl) { try { Object result = getGetterMethod(object, propertyName).invoke(object); return cl.cast(result); } catch (Exception e) { e.printStackTrace(); } return null; }
Jason s
source share