Отчёты об ошибках
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));
Пример для сервера
Минимальный обработчик отчётов:
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.
Последнее обновление:
© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/desktop/error_reporting