Как перехватить исключение Failure, возникающее при разборе номера в ReasonML - PullRequest
1 голос
/ 07 января 2020

Я новичок в Reason. Я хочу проанализировать число с плавающей точкой с правильной обработкой исключений.

Это работает:

let number = try (float_of_string("1,")) {
  | _ => 0.0;
};

Но я хочу сделать что-то вроде этого:

let number = try (float_of_string("1,")) {
  | Failure(_) => 0.0;
};

К сожалению, это не ловит исключение. Я предполагаю, что это исключение Failure, потому что в консоли разработчика я вижу ошибку с этими данными:

[["Failure", -2], "float_of_string"]

Я также попытался вызвать эту ошибку для себя, и она была правильно перехвачена:

try (raise(Failure("test"))) {
  | Failure(_) => Js.log("caught")
};

Редактировать:

Мой код должен работать в соответствии с песочницей: пример для reasonml.github.io/en/try, спасибо @Yawar. Это также работает, если я запускаю его с узла вместо браузера.

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

Я создал демонстрационный репозиторий - Exception Demo

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Проблема с moduleserve , включенным в тему react-hooks (устанавливается bsb -init -theme react-hooks). В каждом другом методе запуска кода, который я пробовал:

  • создание производственного пакета с использованием webpack
  • , обслуживающего код разработчика с помощью webpack-dev-server
  • с использованием веб песочницы reasonml / try , codesandbox
  • запуск файла .js из командной строки с использованием node

работает нормально.

Я создал проблему в проекте BuckleScript.

2 голосов
/ 07 января 2020

Вы проверили float_of_string_opt? Эта функция имеет тип string => option(float), если произошла ошибка, она будет None

Или вы можете сделать

switch (float_of_string("1,")) {
| exception (Failure(_)) => 0.0
| x => x
};

Это доступно, если OCaml бэкэнда> 4,02 (BS обновили до 4.06, так что я думаю, что это будет доступно для вас)

...