throwExceptionForRetry is the answer that most use. You need to construct your flow services so that this is throwned outside of your normal try/catch. It will allow the trigger to resubmit automatically the document for processing. Your trigger settings will determine how long the retry will attempt, you can do a few attempts or until successful.
You would only want to trap non-logic related errors in this retry attempt otherwise you will end up in a loop that you can’t get out of. Non-logic would be database not available, web server not available etc. Bad data or bad logic should not trigger this.
If you have a need to resubmit a document that failed because the data is incorrect or the logic is incorrect then you should consider using WmMonitor and auditing. You can set this for success and/or failure and preserve the input pipeline. An important note about this: If you very high transaction volumes, auditing the service will give you a performance hit.