Двигатель V8 больше не ломается на ошибках - PullRequest
1 голос
/ 01 апреля 2020

Об этой проблеме сообщили в Google: https://issuetracker.google.com/issues/152948662

Краткое описание проблемы

Во время выполнения Rhino Отладчик скрипта (script.google.com) будет прерываться на любую строку, содержащую ошибку (обработана или нет), если пользователь нажимает кнопку «отладка» на панели инструментов. (Он не сломается, если пользователь нажмет кнопку «Выполнить»). Часы windows будут активированы, и пользователь сможет проверить действующие переменные на момент возникновения ошибки.

Во время выполнения V8 отладчик сценария не прекратит работу ни при каких обстоятельствах. Это очень неудобно для отладки.

Небольшой пример кода, который надежно воспроизводит проблему

Образец должен работать как есть или с минимальной настройкой, без внешние зависимости

function testError() {
  var a = {
    title: function() { console.log('hello world') }
  }
  a.titel(); // rhino would break here because of this (unintentional) typo; V8 will not.
}

Какие шаги будут воспроизвести проблему?

  1. Создать новый проект

  2. Вставьте код в Code.gs

  3. Отладьте код

Каков ожидаемый результат? Что ты видишь вместо этого? Если вы видите сообщения об ошибках, предоставьте их.

Ожидается: отладчик прерывается на линии с asdfgh()

Факт: отладчик завершает отладку

Сообщения: отладчик (очень) кратко показывает ошибку как тост и регистрирует необработанную ошибку в журналах и выполнениях.

Пожалуйста, предоставьте любую дополнительную информацию ниже:

Примечание : не важно для этой ошибки. Просто дополнительная информация к вашему сведению. Не позволяйте этому отвлекать вас или сбивать вас с толку

Если эту ошибку можно исправить, я могу использовать свою доморощенную функцию, которая эффективно позволяет мне иметь «точки останова» в любом месте кода, таким образом, обходя Еще одна ошибка в отладчике GAS (точки останова попадают только в текущий файл):

Break(condition, watch) {
  try {
    if(!App.Objects.isUndefined(condition) && !condition)
      return false;
    // you have to step over until you leave Break(). Run doesn't work from here.
    thisFuncDoesntExist();

  } catch (e) {
    return true;
  }
}

Под Rhino я мог бы вызвать это где угодно, и отладчик остановился бы там для меня. Но это только примечание.

1 Ответ

1 голос
/ 02 апреля 2020

Вы должны использовать оператор JS debugger. Это стандартный способ вставки точек останова для отладки в Javascript. В GAS используйте кнопку отладки для запуска вашей функции, и выполнение будет останавливаться при каждом операторе debugger;.

Например, вы сможете обновить свою функцию testError следующим образом:

function testError() {
  var a = 'hello world';
  debugger;
}

Приостановка выполнения для необработанного исключения

Отладчик V8 GAS Runtime не будет приостанавливать исключения. Вам придется явно вставить точки останова, чтобы приостановить запущенный процесс. Вы можете обернуть свою функцию в try-catch, чтобы вызвать отладчик для необработанных исключений.

function myFunction() {
    try {
        // myFunction body...
    } catch(e) {
        debugger;
    }
}

Откат к Rhino:

Однако, если вам действительно нужна эта функция, вы можете вернитесь к старому времени выполнения.

В файле манифеста измените этот параметр: "runtimeVersion": "DEPRECATED_ES5"

Хотя это и дорого: вы не сможете использовать современный синтаксис JavaScript .

Ссылка:

V8 Runtime

...