mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-30 00:01:50 +00:00
Fix for problem:
Subject: Rhino Exception Handling: Inconsistency btw Old/New Versions of 1.5 Date: Mon, 05 Feb 2001 06:07:07 -0800 From: Timothy Bergeron <bergeron@resumerabbit.com> Organization: Another Netscape Collabra Server User Newsgroups: netscape.public.mozilla.jseng I've been using Rhino for about a year with almost no problems. However, I downloaded the latest Rhino tip (rhino15R2pre) and discovered a significant difference in exception handling. I rely heavily on JavaScript code like the following: try { var em = new ExceptionMaker(); em.npe(); // method throws a java.lang.NullPointerException //em.ae(); // method throws a Packages.AutomationException } catch (e if (e instanceof java.lang.NullPointerException)) { java.lang.System.out.println("Caught a NullPointerException"); e.printStackTrace(); } catch (e if (e instanceof Packages.AutomationException)) { java.lang.System.out.println("Caught an AutomationException"); } catch (e) { java.lang.System.out.println("Caught an unexpected exception: "+e); } finally { java.lang.System.out.println("Finally!"); } Previous Rhino versions worked as expected. The exception thrown from within the host object would be caught and the appropriate actions could be taken. With the most recent tip, the thrown exceptions simply are not caught within the JavaScript. They propagate back to the Java function invoking the (in my case) Context.evaluateReader() method. Running the above JS fragement with the older tip displayed the following stack trace (when the NullPointerException was caught): Rhino Version: JavaScript-Java 1.5 release 1 2000 03 15 Caught a NullPointerException java.lang.NullPointerException at java.lang.Throwable.<init>(Throwable.java:84) at java.lang.Exception.<init>(Exception.java:35) at java.lang.RuntimeException.<init>(RuntimeException.java:39) at java.lang.NullPointerException.<init>(NullPointerException.java:45) at ExceptionMaker.jsFunction_npe(ExceptionMaker.java:13) at java.lang.reflect.Method.invoke(Native Method) at org.mozilla.javascript.FunctionObject.call(FunctionObject.java:497) at org.mozilla.javascript.ScriptRuntime.call(ScriptRuntime.java:1205) at org.mozilla.javascript.gen.c1.call(exception.js:3) at org.mozilla.javascript.gen.c1.exec(exception.js) at org.mozilla.javascript.Context.evaluateReader(Context.java:739) at js.main(js.java:14) Finally! When run with the latest tip, the output is: Rhino Version: JavaScript-Java 1.5 release 1 2000 03 15 Finally! Exception in thread "main" java.lang.NullPointerException at java.lang.Throwable.<init>(Throwable.java:84) at java.lang.Exception.<init>(Exception.java:35) at java.lang.RuntimeException.<init>(RuntimeException.java:39) at java.lang.NullPointerException.<init>(NullPointerException.java:45) at ExceptionMaker.jsFunction_npe(ExceptionMaker.java:13) at inv2.invoke() at org.mozilla.javascript.FunctionObject.doInvoke(FunctionObject.java:843) at org.mozilla.javascript.FunctionObject.call(FunctionObject.java:486) at org.mozilla.javascript.ScriptRuntime.call(ScriptRuntime.java:1199) at org.mozilla.javascript.gen.c1.call(Unknown Source) at org.mozilla.javascript.gen.c1.exec(Unknown Source) at org.mozilla.javascript.Context.evaluateReader(Context.java:778) at js.main(js.java:14) Curiously, both Rhino versions seem to be returning the same string from Context.getImplementionVerison(); Anyway, the results from the two runs are clearly different: In the first case, the exception is thown, the correct catch block is invoked (hence the stace trace), and the finally block is invoked. In the second case, the exception is thrown, the finally block is invoked, and the exception is handled by the calling Java method rather than being handled by the JavaScript code. After some research, it appears this change was introducted by a modification to FunctionObject.call() (See http://bugzilla.mozilla.org/show_bug.cgi?id=64788) which used to have: try { Object result = (method != null) ? method.invoke(thisObj, invokeArgs) : ctor.newInstance(invokeArgs); return hasVoidReturn ? Undefined.instance : result; } but now has: Object result = method == null ? ctor.newInstance(invokeArgs) : doInvoke(thisObj, invokeArgs); If I comment out the new code and replace it with the old, the expected exception handling returns. Is this just an oversight or the new expected behavior? Are there any negative side effects (other then the speed decrease in method invocation) if I use the latest tip but use the old method invocation procedure in FunctionObject.call() rather than the new?
This commit is contained in:
parent
5cf8693a6e
commit
82bd85bfce
@ -575,7 +575,11 @@ public class FunctionObject extends NativeFunction {
|
||||
invokersCache.put(method, invoker);
|
||||
}
|
||||
}
|
||||
return invoker.invoke(thisObj, args);
|
||||
try {
|
||||
return invoker.invoke(thisObj, args);
|
||||
} catch (RuntimeException e) {
|
||||
throw new InvocationTargetException(e);
|
||||
}
|
||||
}
|
||||
return method.invoke(thisObj, args);
|
||||
}
|
||||
|
@ -575,7 +575,11 @@ public class FunctionObject extends NativeFunction {
|
||||
invokersCache.put(method, invoker);
|
||||
}
|
||||
}
|
||||
return invoker.invoke(thisObj, args);
|
||||
try {
|
||||
return invoker.invoke(thisObj, args);
|
||||
} catch (RuntimeException e) {
|
||||
throw new InvocationTargetException(e);
|
||||
}
|
||||
}
|
||||
return method.invoke(thisObj, args);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user