When your [program encounters an exceptional circumstance, such as running out of memory, it throws (or "raises") an exception. You might throw an exception in your own methods (for example, if you realize that an invalid parameter was provided) or an exception might be thrown in a class provided by the Framework Class Library (for example, if you try to write to a read-only file). Many exceptions are thrown at runtime when the program can no longer continue due to an operating system problem (such as a security violation). Exceptions must be handled before the program can continue.
Provide for the possibility of exceptions by adding try/catch blocks in your program. The catch blocks are also called exception handlers. The idea is that you try potentially dangerous code, and if an exception is thrown, you catch (or handle) the exception in your catch block.
Ideally, if the exception is caught and handled, the program can fix the problem and continue. Even if your program can't continue, by catching the exception you have an opportunity to print a meaningful error message and terminate gracefully.
When an exception is thrown, execution of the current function halts and the Common Language Runtime (CLR) searches back through the stack until an appropriate exception handler is found. The search for an exception handler can "unwind the stack." This means that if the currently running function does not handle the exception, the current function terminates and the calling function gets a chance to handle the exception. If none of the calling functions handle it, the exception is ultimately handled by the CLR, which will terminate your program abruptly.
If Function A calls Function B and Function B calls Function C, these function calls are all placed on the stack (an area of memory set aside for local variables). When a programmer talks about "unwinding the stack," you back up from C to B to A, as illustrated in Figure 21-1.
If you must unwind the stack from C to B to A to handle the exception, when you are done, you are in Athere is no automatic return to C.
Figure 21-1. Unwinding the stack
If you return all the way to the first method and no exception handler is found, the default exception handler (provided by the Windows Form's Application Run method) wraps all calls to event handlers in a try block and manages uncaught exceptions. Program termination is the default behavior.