Обработка исключений в JS с использованием Graal - PullRequest
1 голос
/ 26 сентября 2019

Я работаю над приложением Java, которое довольно интенсивно использует Javascript для формирования бизнес-логики / клея.Он работает с использованием Graal.Все это прекрасно работает, но мы боремся с эффективной обработкой ошибок.

По сути, это то, как выполняется JS:

try {
    Context context = Context.newBuilder("js").allowAllAccess(true).build()
    Source s = Source.newBuilder("js", src, "script").build();
    context.eval(s);
} catch (Exception e) {
    LOGGER.error("Exception occurred in JavaScript:...", e);
}

Поэтому, когда происходят ошибки, мы их где-то регистрируем, поэтому мы можем сделать некоторые посмертные и т. Д. Можно получить трассировку стека JSэти журналы из PolyglotException, которые выбрасывает Грааль, и это здорово.Тем не менее, все становится сложнее, когда некоторый код JS вызывается обратно на Java-землю, и генерируется исключение Java:

var x = callJavaFunction("invalid parameter"); // Throws a NoSuchElementException, for example

* PolyglotException имеет метод asHostException(), который возвращает исходный Javaисключение, и мой код, который выполняет файлы JS, достаточно умен, чтобы понять это и создать полезный журнал ошибок. Проблема возникает, когда код JS пытался поймать это сам по какой-либо причине:

try {
    var x = callJavaFunction("invalid parameter"); // NoSuchElementException
} catch (e) {
    doSomeCleanup();
    throw e;
}

Теперь мы потеряли исходное исключение , и даже хужетрассировка стека JS теперь просто показывает нам блок catch вместо того, где была причина.isHostException() возвращает false, потому что сейчас это просто ошибка JS.Я не могу найти способ найти первоначальную причину, которая делает диагностику ошибок довольно сложной, особенно когда они вышли из производственной системы.Исходное сообщение об исключении Java заканчивается в объекте JS-error, что полезно, но у нас нет трассировки стека, которой нет.

Какие подходы я могу использовать, чтобы попытаться обратитьсяthis?

Одна мысль, которая у меня возникла: могу ли я подключиться к GraalVM и получить обратный вызов всякий раз, когда выдается исключение хоста?По крайней мере, таким образом у меня мог быть журнал, говорящий «следующие исключения Java были сгенерированы во время выполнения», который я мог прикрепить к сообщению об ошибке.До сих пор я не смог найти способ добиться этого.

...