An exception is an error that disrupts normal program flow. Python handles exceptions by using try and except blocks. Code that may cause an exception is placed in a try block. Corresponding except blocks handle specific exception types. A finally block always executes before the try statement returns and is used to ensure cleanup. Multiple exceptions can be handled in one except block. Exceptions can also be manually raised using the raise keyword.