Exceptions are events that disrupt normal program flow. There are three main types: checked exceptions for anticipated errors, errors for unanticipated external errors, and runtime exceptions for unanticipated internal errors. Exceptions separate error handling code from regular code, allow errors to propagate up the call stack, and group error types into a class hierarchy. Well-designed exceptions indicate broken contracts between code modules. Developers should throw specific exception types to indicate different error conditions rather than generic exceptions.