I have a library which uses application-supplied closures. Those closures need to be able to return Result
. There are a few predefined errors, but the application may want/need to supply application specific errors. I can choose to implement this statically or dynamically:
enum Error<E> {
InvalidInput(String),
// ...
App(E)
}
vs
enum Error {
InvalidInput(String),
// ...
App(Box<dyn std::error::Error>)
}
For this library:
- an application will likely "never" have more than one instance of
Error
, so it's very unlikely that it'll instantiate more than one ofError<E>
. - the snippets are trimmed down; most of the library is generic over another application-defined type, using the dynamic version solely to avoid instantiation of generics won't actually accomplish much.
I am leaning towards the dynamic solution, but I'm curious what people prefer as users of a library, and why.
Are there any other commonly used "application specific errors" patterns that I should be considering?