Неправильная обработка исключений ввода - SmallTalk

Пусть smalltalk msg с именем "sum" возвращает сумму элементов в массиве.

Например: #(1 2 3 4 5) сумма ----> 15

Когда ввод #(1 2 'a' 3 5) сумма. Выполнение заканчивается и показывает большое окно исключения. Вместо этого, как мы можем изящно выйти из выполнения, просто показывая сообщение. Я не хочу, чтобы показывалось большое окно исключений.

sum
    |sum|
    sum := 0
    self do: [:a | sum := sum + a]
    ^sum

Я попытался обработать исключение следующим образом. Тем не менее, я заметил, что выполнение не прекращается в случае неправильного ввода.

sum
    |sum|
    sum := 0
    self do: [:a | 
        (a isInteger) ifFalse:[
            ^[Error signal] on: Exception
            do: [:ex | Transcript show: 'Entered values are non-numeric. Hence comparison is not possible.']
        ]
        sum := sum + a
    ]
    ^sum

Если приведенный ниже код помещен в рабочую область, я ожидал, что выполнение будет прекращено в строке 2. Однако строка 3 также выполняется. | Темп | temp:= #(1 2 3 'как' 4 5) сумма. temp:= temp*5.

1 ответ

Решение

Изменение sum метод игнорирования неправильных типов во входных данных Array не имеет смысла. Кроме того, заменяя его на сообщение пользовательского интерфейса, вы полностью теряете контроль над тем, какой тип ввода допустим. Скорее разберитесь с этими исключениями в месте, где вы используете sum:

[ ^ self readInput sum ] 
    on: Error do: [ :error| Transcript show: 'Invalid input provided for sum' ].
Другие вопросы по тегам