Как отловить исключение, которое выдает модуль при загрузке? - PullRequest
0 голосов
/ 29 октября 2019

Я собираюсь проверить переменные среды и показать страницу с сообщением об ошибке, если среда недействительна. Могу ли я сделать это таким образом?

config.ts выдает исключение, если env недействительно

import * as yup from 'yup'

console.log(process.env)

const envSchema = yup.object({
  REACT_APP_API_BASE_URL: yup
    .string()
    .required()
    .url()
    .label('REACT_APP_API_BASE_URL')
})

export default envSchema.validateSync(process.env)

index.ts загружает config.ts. Может ли он поймать свое исключение?

//try {  import cannot be inside try
import config from 'config' //exception thrown if env is invalid

1 Ответ

2 голосов
/ 29 октября 2019

При использовании этого синтаксиса нет, но это возможно при использовании динамического импорта.

https://mariusschulz.com/blog/dynamic-import-expressions-in-typescript имеет несколько хороших примеров и объяснений TypeScript для динамического импорта.

В вашем случае это будет выглядеть примерно так:

const config = import('config').catch((error) => {
  // Do something if you get an error
});

Обратите внимание, чтоэто делает загрузку асинхронной, поэтому config будет обещанием для значения модуля, а не только для самого значения, и остальная часть вашего кода не будет автоматически ждать, пока эта загрузка будет завершена. Вам нужно явно указать await config, где вы хотите его использовать или аналогичное.

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

В частности, когда выйдет TypeScript 3.7, вы сможете использовать await верхнего уровня в модулях, так что вы можетепревратить config в обычное значение модуля, которое последующий код будет автоматически ожидать, как вы и ожидаете, например:

const config = await import('config').catch((error) => {
  // Do something if you get an error
});

Есть еще один последний вариант: если вы используете модули commonjs, вы можете отступитьна синхронный require('config') вызов:

let config: any;
try {
  config = require('config');
} catch (e) {
  // Do something if you get an error
}

Это будет делать то, что вы ожидаете, но вы потеряете печать (исправимо, но сложно сделать хорошо), и в целом я бы рекомендовал перейти к модулям ES, а неборются с ними, потому что они стандарт.

...