Forgot it? Still for other reasons.
@kennytm thanks
It seems to me that if NoneError
should exist at all, then it should implement Error
, otherwise Box<Error>
doesn't work.
Facing the same issue in 2019 :/
@kennytm After looking through the discussion on #42526, I鈥檓 getting the impression that it is indeed an oversight that there is no way to convert NoneError
to Box<Error>
so that you can use optional?
on a function that returns Result<T, Box<Error>>
.
This becomes a prevalent problem in the trainings I give, when people learn about: Box<dyn std::error::Error>
, because they also try to coerce optionals.
Can this be prioritised? It would be upsetting if this were to be forgotten, particularly since std::error::Error
is quite useful now.
I don't believe this has been forgotten or de-prioritized -- at the very least, based on me re-read of https://github.com/rust-lang/rust/issues/42327, I get the impression that the general feeling is that the Try trait design is not ready and Option
being convertible to Result
via ?
is not something we are sure we want.
In particular, these comments are relevant:
I actually changed my mind on this one. Now that I think about it, it only really makes sense to use ?
on an Option
if the enclosing function returns an Option
. Otherwise if you want to return a Result
you can use .ok_or("message")
to indicate what went wrong. The error message could be much better though.
I agree about the error message. I think one thing we missed in the Try trait design discussion was what the errors for _mixing_ should look like -- right now you get the note about NoneError
, but with the other possible design you would have explicitly gotten something about Result: !Try<Option>
.
I'll note that I think the existence of a NoneError
is a bit strange and a bit of a code smell, and another design should be considered. But if it isn't considered, make sure std::error::Error
is implemented at least, haha.
If NoneError
is to exist, then it should implement Error
, otherwise a better name should be chosen for the ?
try trait result.
But generally, I think I'd like to be able to use ?
in functions returning Result
on either Result
or Option
types (without explicit conversion), while only allowing use on Option
types in functions that return Option
. Does this make sense?
I don't think should implement Try
for Option<T>
.
None
is not an error, it is just a state that may cause errors.
If OptionError
, then try
block does not need Ok-wrapping
.
If you don't have any ? inside, then with ok-wrapping there is no real information about what the "wrapper type" should be (i.e., should try { 3 } have the type Option
or Result , and what should _ be?)
from niko
I see the issue that Try for Error is already on stable.
Note that as of right now, it's absolutely by design that NoneError
doesn't implement Error
, because it's by design that you can't ?
on Option
in something returning Result<_, Box<dyn Error>>
.
It's also unstable for a reason. We have a meeting planned about redesigning the current Try
approach, which will likely remove NoneError
from being involved in ?
-on-Option
.
I strongly discourage anyone from trying to hack around this restriction. Just use .ok_or(GoodReason)
if you want to early-return on None
in a Result
-returning function.
Most helpful comment
It seems to me that if
NoneError
should exist at all, then it should implementError
, otherwiseBox<Error>
doesn't work.