Eric Lippert made a very good summary about the different kinds of exceptions that can occur, at his blog http://bit.ly/d2cOZ4. We think this a good starting point for this part of the chapter.
Fatal exceptions cannot be handled by the developer. You cannot catch them or release your resources. They are raised from the system because your machine or process is out of memory or your hardware is defective. Do not think too much about these exceptions. Show an error message to the user and try to close your application in a safe way if possible. Use the global error event handler for this scenario.
These exceptions are your own fault and you should be able to prevent or at least handle them. They are thrown because of a bug in your program code. Try to reproduce the exception and fix the bug, but do not just catch the exceptions and show an error message. Typically, such an exception is thrown when you pass a null reference...