Yes and no.
First read the MSDN article. It points out quite clearly (and, IMHO,
correctly) that there are two kinds of exceptions in every program.
Exceptions that you can handle gracefully and continue executing, and
exceptions that you can't handle and have no choice but to shut down
the program.
In the former case, yes. You should figure out where the exception is
happening, trap it with a try...catch, and take remedial action.
In the latter case, you should allow the exception to bubble to the top
of the call stack and catch it in the AppDomain.UnhandledException and
the Application.ThreadException handlers. These handles should probably
log the details of the error in a log file somewhere, maybe send an
e-mail to someone in support, and present a pleasant message box to the
user saying nothing more than that something has gone horribly wrong,
the application must shut down now, and that they should call support.
On some occasions, this strategy is insufficient for dealing with fatal
exceptions, because you lose too much context by allowing the exception
to bubble to the top of the call stack, and the log messages are
missing important information. If this is the case, you should catch
the exception and wrap it in a new exception, adding the necessary
context information, and then throw that new exception and let it
bubble up into the global exception handlers.
Read the article: do not attempt to catch evey exception that can be
thrown by every call in your program. Catch only the ones that you can
deal with gracefully, and handle the rest globally.