Какой самый идиоматичный способ представления ошибок в F # - PullRequest
0 голосов
/ 06 декабря 2018

Я работаю над проектом 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

Так какой способ более идиоматичен и удобен в использовании?Я также буду рад видеть лучшие варианты.

1 Ответ

0 голосов
/ 06 декабря 2018

Как правило, это будет дискриминационный союз.Каждая ошибка требует различных подробностей, чтобы сопровождать сообщение.Например:

type DomainErrorTypes =
| ItemNotFound of ItemId
| FileNotFound of string
| InvalidFormat of format
| IncompatibleItems of Item * Item
| SQLError of code:int * message:string
| ...

Вы также можете зафиксировать некоторые исключения (не обязательно все):

| ...
| Exception of exn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...