Stack unwinding is just the process of navigating up the stack looking for the handler. Wikipedia summarizes it as follows:
Some languages call for unwinding the stack as this search progresses. That is, if function
f
, containing a handlerH
for exceptionE
, calls functiong
, which in turn calls functionh
, and an exceptionE
occurs inh
, then functionsh
andg
may be terminated, andH
inf
will handleE
.
Whereas a Swift error doesn't unwind the stack looking for a handler. It just returns, and expects the caller to handle the thrown error. In fact, the sentence after the one you quote goes on to say:
As such, the performance characteristics of a
throw
statement are comparable to those of areturn
statement.
So, using that first example, where f
called g
which calls h
, in Swift, if you want f
to catch the error thrown by h
, then:
h
must explicitly be marked that itthrows
errors;g
must explicitlytry
its call toh
;g
must also be marked that itthrows
errors, too; andf
must explicitlytry
its call tog
.
In short, while some other languages offer stack unwinding in the process of finding the exception handler, in Swift error handling, you must either explicitly catch
the error thrown by functions you try
, or be designated as a function that throws
so that failed try
calls will be thrown back up to the caller. There is no automatic unwinding of the stack in Swift.
All of this is unrelated to the question of whether deallocation takes place. As you've seen, yes, the throw
in Swift behaves much like return
, deallocating those local variables.
It's worth noting that not all exception handling that involves stack unwinding does the deallocation. Generally it does (because of course we want it to clean up when we're handling exceptions), but for example, "the GNU C++ unwinder does not call object destructors when an unhandled exception occurs. The reason for this is to improve debuggability." (From Exception Handling in LLVM.) Clearly, that's only appropriate for unhandled exceptions in debugging environments, but it illustrates the issue that unwinding the stack doesn't necessarily mean that objects are deallocated.
https://stackoverflow.com/questions/46814233/error-handling-in-swift-does-not-involve-stack-unwinding-what-does-it-mean