Hi,

Can you provide us with a real code example that illustrates well your
pain?

Thanks
Mário

A qua, 17/04/2019, 06:08, Anil Kulkarni <anil@terminal.space> escreveu:

> Hi all,
>
> Hopefully this isn't too large a tangent:
>
> One thing that I have consistently found in my projects is that error
> handling is very tedious in my elixir projects. A typical workflow of mine
> is some outer function has a public interface and needs to return either
> the success case, or an {:error, reason} tuple.
> How I usually go about solving that is that at every level of this
> pipeline, I have code that has a with {:ok, a} <-some_function(), {:ok, b}
> <- other_function(a) do {:ok, b}. I then end up needing to 1) Repeat this
> with pipeline throughout my codebase wherever there are failure conditions
> and 2) be precise about my else case to make sure I return the correct
> error condition.
>
> Often I end up with a helper function that returns {:error, :reason_a},
> but is called in two contexts. In a different context, when this error
> happens, {:error, :reason_b} should be returned. Thus, I need to have code
> written like else {:error, :reason_a} -> {:error, :reason_b} in my code.
> This also happens somewhat frequently when calling third party libraries
> and needing to wrap the error semantics in a common layer.
>
> Elixir discourages the pattern of raising exceptions, which makes a lot of
> sense from a functional perspective, so that avenue seems out (except for,
> well, exceptional cases). I bring this up because other languages use
> namespacing or OO inheritance to classify different types of errors which
> allows for more streamlined handling.
>
> All this is to say that I think there is value in adding a more
> opinionated error handling pattern to elixir. This would have the benefit
> of a consistent pattern that would allow libraries to chain together
> easily. I don't have a built out proposal, but my rough thoughts involve an
> `Error` module with the concept of namespacing an error. E.g. something
> like %Error{type: :runtime_error.input_validation.out_of_range, source:
> :my_library, extra: %{}} and associated helper functions & pipelines to
> handle this.
>
> Again, I don't have a concrete proposal, and even if I did, it would make
> more sense to experiment with this as a 3rd party library first. Hopefully
> this post adds to the perspective that error handling is tedious and it
> would be great to look at ways to alleviate this pain point.
>
> Best regards,
> Anil Kulkarni
>
> On 4/16/19, 5:26 PM, "elixir-lang-core@googlegroups.com on behalf of
> Greg Vaughn" <elixir-lang-core@googlegroups.com on behalf of
> gvau...@gmail.com> wrote:
>
>     José, you are so gracious in dealing with the Elixir community. I
> appreciate that very much. It has inspired me to work to be more gracious
> in my own life.
>
>     -Greg Vaughn
>
>
>     > On Apr 16, 2019, at 7:18 PM, José Valim <
> jose.va...@plataformatec.com.br> wrote:
>     >
>     > Hi Tom,
>     >
>     > You probably meant it as a joke but just keep in mind jokes do not
> translate well to text.
>     >
>     > Evaluating the language proposals is often tiresome and it is work
> that is not always appreciated, so it is probably best for everyone to stay
> in topic.
>     >
>     > Thanks,
>     >
>     > On Wed, Apr 17, 2019 at 02:03 <t...@scalpel.com> wrote:
>     > Ok we'll paint the bikeshed green.
>     >
>     > On Tuesday, April 16, 2019 at 7:36:51 PM UTC-4, José Valim wrote:
>     > They probably shouldn't been lists in the first place but that ship
> sailed a long time ago.
>     >
>     > If you need to work with them dynamically, the API is there. It just
> shouldn't be encouraged and adding functions such as Tuple.wrap could
> end-up having the opposite effect: encouraging more dynamic work making
> everyone's life harder, rather than easier.
>     >
>     >
>     > José Valim
>     > www.plataformatec.com.br
>     > Skype: jv.ptec
>     > Founder and Director of R&D
>     >
>     >
>     > On Wed, Apr 17, 2019 at 1:32 AM <t...@scalpel.com> wrote:
>     > I agree that they are rarely used dynamically, but when they are
> they can be quite the pain to work with.
>     >
>     > For example, if you are doing any work with ASN.1 dynamic tuples are
> everywhere. Any advanced work in cryptography or telecom becomes harder to
> work with than I would like it to be.
>     >
>     > On Tuesday, April 16, 2019 at 7:24:15 PM UTC-4, José Valim wrote:
>     > Well, the difference is really in their usage. Tuples are rarely
> used dynamically, you usually want to see tuples as literals in your code.
> The Tuple docs also mention it:
>     >
>     > > The functions in this module that add and remove elements from
> tuples are
>     > > rarely used in practice, as they typically imply tuples are being
> used as
>     > > collections. To append to a tuple, it is preferable to use pattern
> matching
>     >
>     >
>     > José Valim
>     > www.plataformatec.com.br
>     > Skype: jv.ptec
>     > Founder and Director of R&D
>     >
>     >
>     > On Wed, Apr 17, 2019 at 1:20 AM <t...@scalpel.com> wrote:
>     > I see your point.
>     >
>     > I was thinking more along the lines of consistency in the API
> design. If you can wrap an item in a list why can't you wrap it in a tuple?
> If you could wrap things in tuples then you could insert a value at the
> front of said tuple.This is more of an exercise in "you could" rather than
> "you should".
>     >
>     > On Tuesday, April 16, 2019 at 7:07:33 PM UTC-4, José Valim wrote:
>     > If the choice is between:
>     >
>     > value |> Tuple.wrap() |> Tuple.insert_at(0, :ok)
>     >
>     > and
>     >
>     > {:ok, value}
>     >
>     > I believe we should choose the second every time.
>     >
>     > If the choice is between:
>     >
>     > value
>     > |> very()
>     > |> long()
>     > |> pipeline()
>     > |> Tuple.wrap()
>     > |> Tuple.insert_at(0, :ok)
>     >
>     > and:
>     >
>     > value
>     > |> very()
>     > |> long()
>     > |> pipeline()
>     > |> OkError.ok()
>     >
>     > and:
>     >
>     > var =
>     >   value
>     >   |> very()
>     >   |> long()
>     >   |> pipeline()
>     >
>     > {:ok, var}
>     >
>     > I don't see any reason why we should ever do the first one.
>     >
>     > So I really don't see which problem Tuple.wrap is supposed to solve.
>     >
>     > José Valim
>     > www.plataformatec.com.br
>     > Skype: jv.ptec
>     > Founder and Director of R&D
>     >
>     >
>     > On Wed, Apr 17, 2019 at 12:58 AM <t...@scalpel.com> wrote:
>     > I understand that this is possible, and thank you for the suggestion
> but I'm not the biggest fan of anonymous functions.
>     >
>     > When I go back and read programs written this way I can't tell if I
> wrote the code or a cat walked on my keyboard.
>     >
>     > On Tuesday, April 16, 2019 at 6:54:16 PM UTC-4, Ryan Winchester
> wrote:
>     > Yeah, sorry
>     >
>     > value |> (&{:ok, &1}).()
>     >
>     > On April 16, 2019 at 3:51:28 PM, Ryan Winchester (
> he...@ryanwinchester.ca ) wrote:
>     >
>     >> value |> (&{&1}).() |> Tuple.insert_at(0, :ok)
>     >>
>     >> On April 16, 2019 at 3:47:58 PM, t...@scalpel.com (t...@scalpel.com
> ) wrote:
>     >>
>     >>> Fair enough, I know when to give up on a losing battle.
>     >>>
>     >>> Would you consider an alternative like Tuple.wrap/1. It would work
> exactly like List.wrap/1 but doesn't carry the baggage that "error" and
> "ok" would have. This way I could still accomplish the goal of keeping pipe
> chains clean with something like.
>     >>>
>     >>> value |> Tuple.wrap() |> Tuple.insert_at(0, :ok)
>     >>>
>     >>> Which is a bit wordier but functionally equivalent to the original
> proposal.
>     >>>
>     >>> On Tuesday, April 16, 2019 at 6:04:55 PM UTC-4, José Valim wrote:
>     >>> Hi Tom,
>     >>>
>     >>> You don't have to buy the arguments, we can agree to disagree, but
> they are still the reason for not adding such functions to Elixir. :)
>     >>>
>     >>> I also agree with is_even and is_odd being similar convenience
> functions but they do have a rationale. They were added before defguard
> existed. At the time, writing guards was a bit more bureaucratic. But if
> is_odd/is_even were proposed today, they would most likely have been
> rejected as well.
>     >>>
>     >>> Elixir already has a perfectly fine syntax via curly brackets for
> creating ok and error tuples, that also works on matching, so my
> recommendation is still to build an extra vocabulary in your app or as a
> separate library.
>     >>>
>     >>> José Valim
>     >>> www.plataformatec.com.br
>     >>> Skype: jv.ptec
>     >>> Founder and Director of R&D
>     >>>
>     >>>
>     >>> On Tue, Apr 16, 2019 at 11:46 PM <t...@scalpel.com > wrote:
>     >>> I disagree that this should be a library. (I've already done this
> in my app and would be fine extracting it into one though) I don't buy the
> slippery slope argument.  The functions are very simple to create and
> maintain, and it's not like the Tuple module is overflowing with
> complexity. We have things like 'is_even' and 'is_odd' because they are
> common to work with. :ok and :error are insanely common in elixir
> codebases. Why not add convenience methods?
>     >>>
>     >>> On Tuesday, April 16, 2019 at 5:22:38 PM UTC-4, José Valim wrote:
>     >>> Hi Tom, thanks for the proposal.
>     >>>
>     >>> As OvermindDL1 already hinted, this can lead to a slippery slope
> where we need to add bang variants, question mark variants, ok/1/2/3/4 to
> deal with arities and so on. I would suggest building this vocabulary as
> necessary in your applications or, if you want to share it with the world,
> it could be a nice library. Hint: the package ok_error seems to be
> available. :)
>     >>>
>     >>> José Valim
>     >>> www.plataformatec.com.br
>     >>> Skype: jv.ptec
>     >>> Founder and Director of R&D
>     >>>
>     >>>
>     >>> On Tue, Apr 16, 2019 at 11:12 PM OvermindDL1 <overm...@gmail.com
> > wrote:
>     >>> On Tuesday, April 16, 2019 at 3:04:13 PM UTC-6, t...@scalpel.com
> wrote:
>     >>> It is often the case that you want to wrap the result of an
> operation in an ":ok" or ":error" Tuple. We should add convenience wrapper
> functions since this is so common and it cleans up otherwise ugly code.
>     >>>
>     >>> def ok(value), do: {:ok, value}
>     >>> def error(value), do: {:error, value}
>     >>>
>     >>> This could be quite useful!  On the other side it would be useful
> to add functions like these as well:
>     >>>
>     >>> def ok!({:ok, value}), do: value
>     >>>
>     >>> def ok?({:ok, _value}), do: true
>     >>> def ok?(_), do: false
>     >>>
>     >>> And so forth for error as well.  They are not really useful on
> their own because matching is better, but for use in pipes that would be
> quite useful (right now I use the exceptional library, which does similar
> things and more).
>     >>> --
>     >>> You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     >>> To unsubscribe from this group and stop receiving emails from it,
> send an email to elixir-l...@googlegroups.com .
>     >>> To view this discussion on the web visit
> https://groups.google.com/d/
>                             msgid/elixir-lang-core/
> 30614530-7e33-4cb8-bffb- 63c18248d340%40googlegroups. com .
>     >>> For more options, visit https://groups.google.com/d/ optout .
>     >>> --
>     >>> You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     >>> To unsubscribe from this group and stop receiving emails from it,
> send an email to elixir-l...@ googlegroups.com .
>     >>> To view this discussion on the web visit
> https://groups.google.com/d/ msgid/elixir-lang-core/
> 0314757d-eff2-4b23-8130- a19ee921b254%40googlegroups. com .
>     >>> For more options, visit https://groups.google.com/d/ optout .
>     >>> --
>     >>> You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     >>> To unsubscribe from this group and stop receiving emails from it,
> send an email to elixir-l...@googlegroups.com .
>     >>> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/2e7204c7-6d06-49f9-8edc-7c631f75063a%40googlegroups.com
> .
>     >>> For more options, visit https://groups.google.com/d/optout .
>     >
>     > --
>     > You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     > To unsubscribe from this group and stop receiving emails from it,
> send an email to elixir-l...@googlegroups.com.
>     > To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/721abcf1-0cfd-4824-b54a-ff2aa22487f3%40googlegroups.com
> .
>     > For more options, visit https://groups.google.com/d/optout.
>     >
>     > --
>     > You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     > To unsubscribe from this group and stop receiving emails from it,
> send an email to elixir-l...@googlegroups.com.
>     > To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/5607dc54-2c5d-452c-a5a5-fa6ec03864c3%40googlegroups.com
> .
>     > For more options, visit https://groups.google.com/d/optout.
>     >
>     >
>     > --
>     > You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     > To unsubscribe from this group and stop receiving emails from it,
> send an email to elixir-l...@googlegroups.com.
>     > To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/50776062-e75d-4f31-8266-2b633e78bf89%40googlegroups.com
> .
>     > For more options, visit https://groups.google.com/d/optout.
>     >
>     > --
>     > You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     > To unsubscribe from this group and stop receiving emails from it,
> send an email to elixir-lang-core+unsubscr...@googlegroups.com.
>     > To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/f1c5a753-6964-466b-aabb-5f8cdb7c7ec0%40googlegroups.com
> .
>     > For more options, visit https://groups.google.com/d/optout.
>     > --
>     >
>     >
>     > José Valim
>     > www.plataformatec.com.br
>     > Skype: jv.ptec
>     > Founder and Director of R&D
>     >
>     > --
>     > You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     > To unsubscribe from this group and stop receiving emails from it,
> send an email to elixir-lang-core+unsubscr...@googlegroups.com.
>     > To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2Bmvy5%3DC3cgwMPquPsrM32JjNdn0mxdsvOthLt0eXU4yg%40mail.gmail.com
> .
>     > For more options, visit https://groups.google.com/d/optout.
>
>     --
>     You received this message because you are subscribed to the Google
> Groups "elixir-lang-core" group.
>     To unsubscribe from this group and stop receiving emails from it, send
> an email to elixir-lang-core+unsubscr...@googlegroups.com.
>     To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/0482DC4E-5021-44C1-846C-ABABF265BAD3%40gmail.com
> .
>     For more options, visit https://groups.google.com/d/optout.
>
>
>
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to elixir-lang-core+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/0100016a29b23946-7da376b0-900b-4c12-bd01-ab23cea2cc31-000000%40email.amazonses.com
> .
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAF7CYk6yBpzA%3DC4afTHkZSa7UxfyHRWt5FQwAgd_8SrN-BCrUA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to