Yes this is how it works. The compiler statically schedules everything, and everything happens in-order. The spiller transparently takes care of storing results that where inflight during calls and makes them available when their retire cycle comes, if necessary.
Exception is an overloaded term but I guess you mean c++ -like exceptions?
These are in the language and runtime, and to the core knows nothing about them. They are just rarely-taken branches and returns.
The stack trace, however, may be recovered using a special system service which can talk to the hardware; or a language runtime may record the call stack itself using its own metadata.