{exception 'message'} executes throw new Exception ('message') inside the tag's handler. Where {error} reports an error the polite way, through padError(), this one behaves like PHP code that fails - a database library that throws, a division by zero - so it is the tag to try out how an application and its configuration deal with such a failure.

With $padErrorTry on (the default) the engine runs every tag handler inside a try guard: the exception is caught there and handed to the configured $padErrorAction, the same way as an error - under pad the request ends with status 500 and the report (the request id for a visitor who is not local), under log or ignore the page renders on without the tag. With the guards off it reaches PHP's exception handler: the error action records it and the request ends there as a failure, whatever the action.

It is mainly there for testing: the regression suites use it to prove that every error action and every guard behaves as documented. In application code, prefer {error}.