Разное между броском и ловлей в передаче исключение - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть простой код, подобный приведенному ниже, чтобы проверить, как Эрланг обрабатывает исключения.Ссылка **** для throw и catch.

-module(exception).
-export([sum/2]).
-export([is_odd/1]).

sum(A, B) ->
    case is_odd(A) of
    odd ->
        2*A+B;
    Result ->
        Result
    end.


is_odd(A) ->
    case is_integer(A) of
    true ->
        odd;
    _ -> ****({error, "Input error"})
    end.

Когда я запускаю диализатор с throw, отображается предупреждение:

exception.erl: 9: переменная Result можетникогда не совпадать, так как предыдущие пункты полностью покрывали тип 'odd'

Это предупреждение можно исправить, добавив

case catch

для функциивесело / 2.

Когда я запустил диализатор с защелкой, диализатор прошел успешно.

Интересно немного о ловле и броске.Какую ситуацию мы должны бросить или поймать?

1 Ответ

0 голосов
/ 19 февраля 2019

Если вы используете throw (для ****), ваша функция is_odd (A) будет всегда возвращать только одно нормальное значение: атом 'нечетный'.Вот что говорит вам диализатор: предложение в строке 9 (Результат ->) никогда не может совпадать.Если is_odd (A) возвращает значение, оно должно быть 'нечетным', поэтому всегда будет выбрано первое предложение.

Если вы напишите 'case catch is_odd (A) of ...', то любой выброшенныйисключение будет поймано и превращено в значение.В вашем случае это кортеж {error, «Input input»}.(Обратите внимание, что это «старый стиль» catch Expression, и обычно предпочитается использовать современный try ... catch ... end вместо этого во всем новом коде.) Теперь неожиданно снова появляются два возможных значения, и предложение в строке 9 также можетвыбирайте, чтобы диализатор не жаловался.

В общем, используйте исключения для относительно редких условий и используйте обычные возвращаемые значения для обычных вещей.Однако иногда может быть хорошей идеей использовать исключения в качестве длинного прыжка («нелокальный возврат») для выхода из глубокой рекурсии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...