Added some custom exceptions to be thrown when conditions aren't met. This might break a lot several things, will test after this build completes but the unit tests all seemed to run fine.