Я изучаю erlang и не понимаю, как вы сопоставляете шаблон для throw
в блоке catch
, когда у вас есть и error
, и exit
?
Модуль
-module(err).
-compile([debug_info]).
-export([thro/1]).
thro(F)->
try F() of
3->"it worked gt then 3";
4->"gt then 4";
5-> throw(44)
catch
error:[Y|[Z|X]]->{Y+Z,2};
exit:[X|Y]->{exit,caught,"exiting with code:"++X};
error:44 -> {"thew on result"} % should it be 44 -> something
end.
Использование:
Для первого случая: err:thro(fun()->error([1,2,3])end).
Для второго случая: err:thro(fun()->exit(["A","b"])end).
Теперь я хочу для этого случая: err:thro(fun()->5)end).
Бросок пойман по схеме error
, схеме exit
или ни одной? Как я могу обработать свой бросок, если у меня есть другие шаблоны выходов/ошибок?
🤔 А знаете ли вы, что...
Erlang предоставляет средства мониторинга и профилирования для анализа производительности приложений.
Is a throw catched in an error pattern , a exit pattern or none ?
Он попадает в шаблон throw
, однако ваш throw()
должен быть внутри функции F:
-module(my).
-compile([export_all]).
go(F)->
try F() of
_ -> no_errors
catch
error:[Y|[Z|_]]->{Y+Z,2};
exit:[X|_Y]->{exit,caught,"exiting with code:"++X};
throw:Value -> {throw, Value}
end.
В оболочке:
27> my:go(fun() -> throw(5) end).
{throw,5}
Другими словами, try F()
отлавливает только те ошибки, которые возникают внутри F, а не где-либо еще в вашем коде. Если catch поймал ошибки отсюда:
5-> throw(44)
Тогда вам не нужно было бы писать try F()
, вы могли бы просто написать F()
.