зеркало из https://github.com/mozilla/pjs.git
9e7be2a9b1
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? |
||
---|---|---|
.. | ||
examples | ||
macbuild | ||
org/mozilla | ||
src/org/mozilla | ||
toolsrc/org/mozilla/javascript/tools | ||
Makefile | ||
README.html | ||
apiClasses.properties | ||
build.xml | ||
built-on-date | ||
manifest |
README.html
<html> <!-- - The contents of this file are subject to the Netscape Public - License Version 1.1 (the "License"); you may not use this file - except in compliance with the License. You may obtain a copy of - the License at http://www.mozilla.org/NPL/ - - Software distributed under the License is distributed on an "AS - IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or - implied. See the License for the specific language governing - rights and limitations under the License. - - The Original Code is Rhino code, released - May 6, 1999. - - The Initial Developer of the Original Code is Netscape - Communications Corporation. Portions created by Netscape are - Copyright (C) 1998-1999 Netscape Communications Corporation. All - Rights Reserved. - - Contributor(s): - Norris Boyd - - Alternatively, the contents of this file may be used under the - terms of the GNU Public License (the "GPL"), in which case the - provisions of the GPL are applicable instead of those above. - If you wish to allow use of your version of this file only - under the terms of the GPL and not to allow others to use your - version of this file under the NPL, indicate your decision by - deleting the provisions above and replace them with the notice - and other provisions required by the GPL. If you do not delete - the provisions above, a recipient may use your version of this - file under either the NPL or the GPL. --> <body> <h1> <span CLASS=LXRSHORTDESC> Rhino: JavaScript in Java<p> </span> </h1> <span CLASS=LXRLONGDESC> Rhino is an implementation of JavaScript in Java. Documentation can be found <a href="http://www.mozilla.org/js/rhino/rhino.html">here</a>. </span> </body> </html>