Есть ли стандартные исключения? - PullRequest
6 голосов
/ 16 ноября 2011

Я использовал throw new Exception("...") в своем коде, так как я не мог найти что-либо еще, чтобы использовать.Я ищу такие вещи, как C ++ out_of_range и logic_error классы.

std.exceptionопределяет несколько функций, помогающих с обработкой исключений, но без реальных типов.

Мы должны определить все наши собственные исключения или Exception просто используется для всего?

Ответы [ 2 ]

7 голосов
/ 16 ноября 2011

По большей части в Фобосе каждый модуль имеет свой собственный тип исключения, названный в честь модуля - например, 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 вместо прямого исключения (хотя, очевидно, в некоторых случаях имеет смысл сгенерировать одно исключение). напрямую).

0 голосов
/ 16 ноября 2011

druntime определяет несколько . Есть также специальные для плохих ошибок и тому подобное в конкретных модулях.

...