По большей части в Фобосе каждый модуль имеет свой собственный тип исключения, названный в честь модуля - например, UTFException
для std.utf и FileException
для std.file. Есть некоторые, которые этого не делают (например, std.concurrency имеет несколько типов исключений - MessageMismatch
, OwnerTerminated
и т. Д.), Но это общая тенденция. Как таковые, нет никаких типов исключений, созданных с мыслью, что программисты сами будут их создавать. Ничто не мешает вам использовать какие-либо из существующих типов исключений, но в большинстве случаев их повторное использование не имеет смысла, поскольку они зависят от модуля, а не от варианта использования.
Теперь ближайшая аналогия типов out_of_range
и logic_error
в C ++ будет Error
с, а не Exception
с, в частности core.exception.RangeError
и core.exception.AssertError
. Error
отличаются и не предназначены для восстановления. core.exception определяет несколько из них (включая OutOfMemoryError
). Обычно вы не используете их сами, но можете, если хотите. AssertError
- это то, что выбрасывается assert
при неудаче.
Итак, чтобы быть ясным, Throwable
является базовым типом исключения. Error
и Exception
являются производными от Throwable
. Любой тип исключения, который не является производным от Exception
, пропускает деструкторы, операторы области видимости и, наконец, блоки и является , а не , предназначенным для восстановления из. Существует несколько стандартных Error
, которые в основном содержатся в core.exception, но вы можете определить свои собственные, если они вам нужны. Вы, вероятно, не будете часто использовать или определять Error
- кроме использования assert
.
С другой стороны, все, что получено из Exception
, предназначено для восстановления, а будет вызывать деструкторы, операторы видимости и, наконец, блоки. Существуют , а не , как правило, стандартные Exception
-обработанные типы, которые вы бы создали в своем собственном коде. Вы ловите Exception
s, которые определяет Фобос, но вы обычно их не бросаете. Скорее, вы либо создаете экземпляр Exception
напрямую, либо используете свой собственный тип Exception
.
Также часто считается хорошей практикой использовать enforce
и enforceEx
вместо прямого исключения (хотя, очевидно, в некоторых случаях имеет смысл сгенерировать одно исключение). напрямую).