There are three types of errors in programming: compile time errors due to incorrect syntax, run time errors due to limitations of memory or processing, and logical errors due to flawed program logic. Exceptions can be checked at compile time or unchecked at run time. To handle exceptions, programmers use try, catch, and finally blocks to gracefully handle errors, print stack traces, and ensure cleanup.