Exceptions don't shortcircut anything in the extension API. Its purely a userland concept.
Exception being thrown means absolutely nothing to the internal c code and execution continues just as normal :)

You have to throw in all the return;s manually and manually check for EG(exception).
We usually do this by "throwing" an exception, and then return an error code that we'll check for.

It is annoying that exceptions are thrown very deeply in our codebase, and we then have to carry up weird contexts.. Would be easier to follow if we didn't raise exceptions so deeply but did it in the functions themselves.
Would be easier to document too :]