I propose that errors.AccessError.__init__ be changed to the following:
def __init__ (self, msg=''):
self.msg = msg or "Access denied"
When you have 'msg=None', and you do 'raise AccessError', you wind up with
an exception whose __str__ returns None and crashes when you try to print it.