В документах не говорится, что failwith
возвращает Exception
.Он говорит, что генерирует исключение F #.Система исключений отделена от обычного потока управления возвращаемыми значениями.Отсюда и название, это исключительная .
Исключения, когда слово «выброшенный» (который, как мне кажется, является менее двусмысленным, чем «сгенерированный», используемый в документах), поднимется вверхстек до тех пор, пока не встретится конструкция try ... with
, которая обрабатывает этот конкретный тип исключения, или, если нет, завершит программу.Подробности см. В документации F # по обработке исключений .
failwith
возвращает 'a
, так что его можно использовать где угодно, поскольку 'a
может означать что угодно.Он может притворяться, что возвращает что-либо, потому что он вообще никогда не возвращает, в отличие от большинства функций, он всегда выдает исключение.Если бы он возвратил Exception
, он мог бы использоваться только в выражениях, которые, как ожидается, будут иметь значение Exception
, что является необычно необычным, поскольку исключения обычно генерируются, а не возвращаются.Например, с учетом:
if i > 0 then
i
else
failwith "i is negative"
Если бы failwith
вернул Exception
, компилятор жаловался бы здесь на int
, ожидаемое вместо Exception
, поскольку первая ветвь оценивается как int
.Но так как failwith
возвращает 'a
, вместо этого подразумевается, что он равен int
, и все в порядке.