> tuple[User | None, Exception | None]
tuple[User, None] | tuple[None, Exception]
tuple[User, None] | tuple[None, Exception]
The original is more like Go approach which is a big flaw with the language.
I've also seen APIs that allow returning both error and a value ("something went wrong, but here is a fallback or something") which are of course extremely confusing given the usual style.