It should be, in the ideal world, just be thrown as a last resort... but in reality it isn't. I assume it is because when you find a nice IllegalStateException, you might feel that it really describes your condition quite well, so you use that without realizing that it is a surprise exception since that is not very clear. When you are using your IDE and need to throw an exception in an error case, it is not clear what is a runtime exception and not, and then you are not forced to use throws and here we are...
The equivalent in Rust would be to have a std::error::GenericError(String)
in rust, that looks like a normal error but secretly panics under the hood.
a crate may contain may different parts, and you may not always want all of them to avoid bloat. For an example, a crate may contain a sync and an async version, but you will probably only want one of them. So then the crate exposes the different parts as features. In clap they have defined the default features as:
default = ["std", "color", "help", "usage", "error-context", "suggestions"]
So, then if you need to use functionality not included there, then you have to specify it in your features list. On https://docs.rs/crate/clap/latest you can find a drop down in the top menu with Feature Flags, then they also have the documentation for the feature flags here https://docs.rs/clap/latest/clap/_features/index.html