Exceptions can have different degrees of impact on a program. For example a program should probably abort if OutOfMemoryException is raised, but it is possible to safely and appropriately handle System.Data.SqlClient.SqlException without putting the program in an unknown state.
I do understand that any exception has the potential to put the program in an unstable state if it is not properly handled. Are there exceptions that should never be handled beyond simply logging and throwing up the stack?
The Framework Design Guidelines cover this pretty completely:
Do not catch System.Exception or System.SystemException in framework code, unless you intend to re-throw.
...
Do not catch System.StackOverflowException.
It is extremely difficult to programmatically handle a stack overflow. You should allow this exception to terminate the process and use debugging to determine the source of the problem.
...
Do not catch System.Runtime.InteropServices.SEHException explicitly.