Я работаю над проектом F #, и мне интересно, как лучше возвращать ошибку домена, используя тип Result
в F #.Есть несколько способов сделать это, которые я считаю:
Унаследованные исключения
type DomainException(message) =
inherit Exception(message)
type ItemNotFoundException(item) =
inherit DomainException(sprintf "Item %s is not found" item)
let findItem item =
match item with
| Some x -> Ok x
| None -> Error(new ItemNotFoundException("someitem"))
Пользовательский тип записи
type DomainError =
{ Name : string
Message : string }
let findItem item =
match item with
| Some x -> Ok x
| None ->
Error({ Name = "ItemNotFound"
Message = "Item someitem is not found" })
Дискриминационное объединение типа записи
type DomainErrorTypes =
| ItemNotFoundError of DomainError
| ItemInvalidFormat of DomainError
let findItem item =
match item with
| Some x -> Ok x
| None ->
{ Name = "ItemNotFound"
Message = "Item someitem is not found" }
|> ItemNotFoundError
|> Error
Так какой способ более идиоматичен и удобен в использовании?Я также буду рад видеть лучшие варианты.