Spec-Zone.ru › Deno 2

Отчёты об ошибках

Доступно в Deno 2.9

deno desktop доступно начиная с Deno v2.9.0. Если у вас установлена более ранняя версия, обновите Deno, чтобы использовать эту возможность.

Приложения deno desktop автоматически перехватывают:

  • Необработанные исключения JavaScript (как в коде на стороне Deno, так и в коде на стороне рендерера).
  • Необработанные отклонения промисов.
  • Паники Rust внутри среды выполнения или бэкенда рендеринга.

При возникновении одной из этих ситуаций среда выполнения показывает системное диалоговое окно с сообщением об ошибке и, если вы настроили URL для отправки отчётов, отправляет JSON-отчёт POST.

Настройка

Укажите desktop.errorReporting.url в файле deno.json:

{
  "desktop": {
    "errorReporting": {
      "url": "https://errors.example.com/report"
    }
  }
}

URL должен использовать https:// или file://. Обычный http:// не принимается, поскольку отчёты содержат трассировки стека и контекст среды выполнения, которые могут быть прочитаны любым узлом на пути передачи данных. URL file:// пригодится для локального тестирования: среда выполнения дописывает JSON в этот путь, а не отправляет HTTP-запрос.

Если errorReporting.url не задан, диалоговое окно всё равно появится, но отчёт отправлен не будет.

Формат отчёта

{
  "version": 1,
  "message": "TypeError: Cannot read properties of null",
  "stack": "TypeError: Cannot read properties of null (reading 'foo')\n    at handler (file:///main.ts:12:14)\n    at …",
  "appVersion": "1.4.0",
  "timestamp": "2026-04-08T12:00:00.000Z",
  "platform": "darwin",
  "arch": "aarch64"
}
Поле Тип Примечания
version 1 Версия схемы. Проверьте её на стороне сервера.
message string Сообщение об ошибке: message.
stack string Место возникновения ошибки: stack. При возможности применяется сопоставление с исходным кодом.
appVersion string | null Deno.desktopVersion на момент возникновения ошибки.
timestamp строка в формате ISO 8601 Метка времени UTC, указывающая, когда была перехвачена ошибка.
platform "darwin" | "windows" | "linux" Deno.build.os.
arch строка Deno.build.arch.

Заголовок Content-Type имеет значение application/json. Отчёты отправляются одним POST-запросом без повторных попыток. Если сервер недоступен, отчёт будет потерян. Для важных отчётов сохраняйте их в локальную очередь и отправляйте при следующем запуске.

Какие данные попадают в отчёт

Источник Перехватывается?
Необработанное исключение в коде на стороне Deno Да.
Необработанное отклонение промиса в коде на стороне Deno Да.
Необработанное исключение JavaScript на стороне рендерера Да; перехватывается через событие error рендерера.
Паника Rust в среде выполнения Deno Да.
Паника Rust в бэкенде рендеринга (CEF, …) Да; бэкенд перехватывает такие ошибки.
console.error / console.warn Нет; это не ошибки.
Исключения, которые вы самостоятельно try/catch Нет.

Ошибки, возникающие в обработчике привязки, передаются на сторону веб-представления и приводят к отклонению вызывающего промиса. Они не регистрируются как необработанные ошибки: веб-представление их перехватывает. Чтобы всё же отправлять отчёты о них, записывайте их в журнал самостоятельно в обработчике привязки.

Отключение диалогового окна

Диалоговое окно предназначено для информирования пользователя о возникновении проблемы. Оно появляется при каждой необработанной ошибке, необработанном отклонении промиса и панике. В настоящее время отключить его из пользовательского кода нельзя: среда выполнения регистрирует обработчики error и unhandledrejection до запуска вашего кода, поэтому preventDefault() в добавленном позднее обработчике не предотвратит показ окна или отправку отчёта.

Чтобы ошибка не вызывала показ диалогового окна, не допускайте, чтобы она оставалась необработанной: перехватывайте её с помощью try/catch (или локальной обработки ошибок) в коде и реализациях привязок:

win.bind("readFile", async (path) => {
  try {
    return await Deno.readTextFile(path);
  } catch (e) {
    reportToOwnTelemetry(e);
    return null; // handled, no alert
  }
});

Для сбора дополнительной телеметрии вы всё ещё можете добавить собственные обработчики error / unhandledrejection; они выполняются после встроенного обработчика одновременно с показом диалогового окна и отправкой отчёта:

addEventListener("error", (e) => reportToOwnTelemetry(e.error));
addEventListener("unhandledrejection", (e) => reportToOwnTelemetry(e.reason));

Пример для сервера

Минимальный обработчик отчётов:

server/report.ts
Deno.serve({ port: 8080 }, async (req) => {
  if (req.method !== "POST") return new Response(null, { status: 405 });

  const report = await req.json();
  if (report.version !== 1) {
    return new Response("unsupported version", { status: 400 });
  }

  await Deno.writeTextFile(
    `./reports/${report.timestamp}.json`,
    JSON.stringify(report, null, 2),
  );
  return new Response(null, { status: 204 });
});

В рабочей среде данные следует записывать в базу данных или пересылать в специализированную службу сбора данных о сбоях.

Вопросы конфиденциальности

По умолчанию отчёт содержит трассировки stack, в которых могут присутствовать пользовательские данные из сообщений об ошибках (имена файлов, URL-адреса, параметры запросов, сериализованные поля объектов). Если ваше приложение обрабатывает конфиденциальные данные, рассмотрите следующие меры:

  • Удаляйте аргументы из кадров стека перед отправкой.
  • Маскируйте URL-адреса вызовов Deno.readTextFile и подобных вызовов.
  • Запрашивайте у пользователя разрешение перед отправкой первого отчёта (однократный запрос согласия).

Эти решения принимаются на уровне приложения; встроенный механизм отправки отчётов передаёт имеющиеся данные, и отфильтровать их содержимое из пользовательского кода нельзя. Чтобы полностью контролировать данные, покидающие устройство, не задавайте errorReporting.url и отправляйте собственные отчёты из обработчиков error / unhandledrejection.

Последнее обновление: 25 июня 2026 г.

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/error_reporting

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API