Exception handling allows programs to continue running or terminate gracefully when errors occur. There are several types of exceptions including errors, checked exceptions, and runtime exceptions. Code uses try-catch blocks to catch exceptions and handle them. Exceptions can be thrown from methods or from the JVM. Finally blocks are always executed to perform cleanup. Custom exception classes can be created by extending the Exception class.