Как сопоставить шаблон с простым броском, когда присутствуют и другие шаблоны?

Я изучаю 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 предоставляет средства мониторинга и профилирования для анализа производительности приложений.


45
1

Ответ:

Решено

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().