A "golden rule" in a driver/client architecture is Do it correctly or signal an error. It's worth reiterating here that all method calls and all property read/write operations may raise exceptions. Be prepared if you are an app developer, and always raise an error if your driver is unable to successfully complete a requested operation. This includes raising errors to an app which is trying to read one of your properties if something has gone wrong. Never lie to an app.
When a piece of hardware needs retries, it is the driver's responsibility to do those retries, if appropriate, and hide this from apps. Only the driver knows the behavior of that particular piece of hardware and when retries are appropriate or not.
It is wrong to expect apps to provide retries because this would force app authors to include device dependent logic to test possibly invisible conditions and make decisions as to the safety and efficacy of retrying a driver call. It breaks the driver/client layering, forcing every app author to independently guess and implement recovery code with less-than-sufficient knowledge of the inner workings of ypur device. This is one of The General Principles.