Production Code is typically written with multiple layers of abstraction.
Typical patterns involve generic ones like Proxy / Command patterns.
In these types of pattern, execution context is provided by the Client/Invoker.
But, the implementation for execution is done by the different abstraction object.
Also, in such cases typically there are multiple implementation objects that gets executed based on configuration/scenarios that are only decided at runtime.
Based on organizational structure and how work gets divided it might be built by different teams within or spanning multiple organizations.
In such chases, to gracefully handle and implement the functionality of the Client/Invoker, recovering from panic's is important.
I have personally used recover() to gracefully handle scenarios that arose from third party libraries.