Any errors from calling `bpy.ops.render.render(write_still=True)` would be suppressed, making it impossible to know what went wrong. Now the operator now reports errors when run via `exec` which mainly occurs when the operator is called from scripts. Interactively rendering via `invoke` is left as-is since users can see the error in the UI and showing a popup error is disruptive.