Custom exceptions

This implements the custom exceptions I was thinking of.  Still need to do some testing on it with the mutation testing branch to see if it helps clean up the reports.