Description
Is your feature request related to a problem or challenge? Please describe what you are trying to do.
In IOx (and in DataFusion) we often want to know what the root cause of an error is (e.g was it a bug or was it a resources exhausted). ArrowError can wrap other errors with Arrow::External
(and DataFusion has something similar) but there is no easy way to get at the source of the error to walk the chain without knowing all the possible types that may be present
I believe this is what https://doc.rust-lang.org/std/error/trait.Error.html#method.source is for
I would like to be able to write something like this to walk the chain
let mut root_error: &dyn Error = &e3;
loop {
match root_error.source() {
// walk the next level
Some(source) => root_error = source,
// at root (as much as we know)
None => break,
}
}
However, ArrowError does not implement source
yet
Of course, all the errors in the chain need to implement this
Describe the solution you'd like
For ArrowError / FlightError that wrap other errors, implement Error::source()
Describe alternatives you've considered
See https://github.com/apache/arrow-datafusion/blob/dde23efed94704044822bcefe49c0af7f9260088/datafusion/common/src/error.rs#L361-L439 for what we need to do now in datafusion 🤮
cc @crepererum
Additional context
Activity
std::error::Error::source
forArrowError
andFlightError
#3567crepererum commentedon Jan 19, 2023
I think we should replace the
find_root
method in DataFusion with this mechanism as well and embrace the standard 💪alamb commentedon Jan 19, 2023
On it!
alamb commentedon Jan 19, 2023
Follow on ticket in datafusion: apache/datafusion#4991
tustvold commentedon Jan 27, 2023
label_issue.py
automatically added labels {'arrow'} from #3567tustvold commentedon Jan 27, 2023
label_issue.py
automatically added labels {'arrow-flight'} from #3567