8c1dea14

Обработка Ошибок JavaScript в Java


Когда JavaScript-код вызываемый из Java, терпит неудачу на этапе прогона программы, он вызывает исключение. Если Вы вызываете JavaScript-код из Java, Вы можете отловить это исключение в операторе try...catch. Исключение JavaScript доступно в Вашем Java-коде как экземпляр netscape.javascript.JSException.

JSException это Java-оболочка вокруг исключения любого типа, вызываемого в JavaScript, аналогично тому, как экземпляры JSObject являются оболочками для JavaScript-объектов. Используйте JSException, если Вы вычисляете JavaScript-код в Java.

Если Вы вычисляете JavaScript-код в Java, следующие ситуации могут вызвать ошибки времени выполнения:

 

    Код JavaScript не вычисляется или из-за ошибки компиляции JavaScript, или из-за какой-нибудь другой ошибки времени выполнения.

    Интерпретатор JavaScript генерирует сообщение об ошибке, которое конвертируется в экземпляр JSException.

     

Java успешно вычисляет JavaScript-код, но JavaScript-код выполняет необработанный оператор throw.

JavaScript вызывает исключение, которое обёрнуто как экземпляр JSException. Используйте метод getWrappedException из JSException для развёртывания этого исключения в Java.

Например, предположим, что Java-объект eTest вычисляет строку jsCode, которую Вы ему передали. Вы можете отреагировать на любую ошибку времени выполнения, возникающую при вычислении, реализуя такой обработчик исключения:

import netscape.javascript.JSObject;

import netscape.javascript.JSException;

public class eTest {

    public static Object doit(JSObject obj, String jsCode) {

        try {

            obj.eval(jsCode);

        } catch (JSException e) {

            if (e.getWrappedException()==null)

                return e;




            return e.getWrappedException();

        }

        return null;

    }

}

В этом примере код блока try пытается вычислить строку jsCode, переданную ему Вами. Скажем, Вы передали строку "myFunction()" в качестве значения jsCode. Если myFunction не определена как функция JavaScript, интерпретатор JavaScript не может вычислить jsCode. Интерпретатор генерирует сообщение об ошибке, Java-обработчик отлавливает сообщение, а метод doit возвращает экземпляр объекта netscape.javascript.JSException.

Предположим, однако, что myFunction определена в JavaScript так:

function myFunction() {

   try {

      if (theCondition == true) {

         return "Everything's ok";

      } else {

         throw "JavaScript error occurred" ;

      }

   } catch (e) {

      if (canHandle == true) {

         handleIt();

      } else {

         throw e;

      }

   }

}

Если theCondition - false, функция вызывает исключение. Это исключение отлавливается в коде JavaScript, и, если canHandle - true, JavaScript обрабатывает исключение. Если canHandle - false, исключение повторно вызывается, Java-обработчик отлавливает его, а метод doit возвращает Java-строку:

JavaScript error occurred

См. в разделе полную информацию об исключениях JavaScript.



Обратная Совместимость


В JavaScript 1.3 и ранее, класс JSException имел три public-конструктора, которые по выбору принимали строковой аргумент, специфицирующий детали сообщения или другую информацию для исключения. Метод getWrappedException отсутствовал.

Используйте оператор try...catch для обработки LiveConnect-исключений в JavaScript 1.3 и более ранних версиях таким образом:

try {

   global.eval("foo.bar = 999;");

} catch (Exception e) {

   if (e instanceof JSException) {

      jsCodeFailed()";

   } else {

      otherCodeFailed();

   }

}

В этом примере оператор eval терпит неудачу, если foo не определено. Блок catch выполняет метод jsCodeFailed, если оператор eval в блоке try вызывает JSException; метод otherCodeFailed выполняется в случае, если блок try вызывает какую-либо иную ошибку.




Содержание раздела