StackOverflowException
is not caught because it indicates a condition that is not easily recoverable, but only in more recent versions of the .NET Framework.
http://msdn.microsoft.com/en-us/library/system.stackoverflowexception(v=vs.110).aspx
From the documentation
Version Considerations
In prior versions of the .NET Framework, your
application could catch a StackOverflowException object (for example,
to recover from unbounded recursion). However, that practice is
currently discouraged because significant additional code is required
to reliably catch a stack overflow exception and continue program
execution. Starting with the .NET Framework version 2.0, a
StackOverflowException object cannot be caught by a try-catch block
and the corresponding process is terminated by default. Consequently,
users are advised to write their code to detect and prevent a stack
overflow. For example, if your application depends on recursion, use a
counter or a state condition to terminate the recursive loop. Note
that an application that hosts the common language runtime (CLR) can
specify that the CLR unload the application domain where the stack
overflow exception occurs and let the corresponding process continue.
For more information, see ICLRPolicyManager Interface and Hosting
Overview.