Deno: как обрабатывать исключения

#node.js #typescript #exception #deno

#node.js #typescript #исключение #deno

Вопрос:

В nodejs мы можем обрабатывать исключения следующим образом:

 process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}n`  
    `Exception origin: ${origin}`
  );
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');
  

Какова альтернатива для deno?
Я знаю, что есть window.onunload, но он не обрабатывает ошибки

Ответ №1:

Это выбор дизайна (на самом деле центральный) для Deno — всегда умирать при неперехваченных исключениях. Вы не можете разместить глобальный обработчик для своих ошибок, поскольку иногда ваши исключения могут быть невосстановимыми и могут вызывать побочные эффекты, которые изменяют общее состояние вашего приложения. Таким образом, необработанные обработчики исключений означают проблемы. Глобальная обработка исключений на данный момент NODEJS не поощряют это, поэтому, пожалуйста, не полагайтесь на такой код в будущем и на этой платформе.

При этом, как обрабатывать отклонения? try / catch / finally для кода синхронизации. .then / .catch / .finally для асинхронного кода.

РЕДАКТИРОВАТЬ: интересным ресурсом, который вы можете использовать, является unhandledRejection событие, это событие, предназначенное для реализации очистки, то есть для закрытия открытых соединений, освобождения ресурсов, закрытия файлов и т. Д. Это не остановит исключение от завершения программы, но даст вам пространство для предотвращения вторичных эффектов при завершении программы.

https://developer.mozilla.org/en-US/docs/Web/API/Window/unhandledrejection_event

Комментарии:

1. Однако, как я могу создать сценарий завершения процесса, который выполняется даже при исключениях?

2. @Storm7953 Для этой цели можно использовать событие необработанного отклонения. Я обновил свой ответ более подробным объяснением этого

3. К сожалению, похоже, что это еще не реализовано. github.com/denoland/deno/issues/7013 РЕДАКТИРОВАТЬ: Похоже, что это даже никогда не будет реализовано…