Когда нужно как-то отличить одно исключение от других. Вот и все, правда. Конечно, вы можете создать класс исключений, который также использует перечисление для определения причины.
Это действительно легко увидеть, если вы хотите передать дополнительную информацию за исключением. Единственная причина для передачи этой информации - если вы хотите иметь возможность получить эту информацию позже, и вам нужно знать тип, чтобы вы могли получать информацию из этого типа, а не из других.
В C ++ и, возможно, в некоторых других языках вы также можете вводить исключение. Это позволило бы различать типы и, возможно, в будущем преобразовать их в пользовательский класс.