From charlesreid1

Abstract exception class

To raise your own custom Exception type, it's really easy to define a new Exception with a custom name:

class MyNewException(Exception):

Done. Now we can do raise MyNewException("Oh no!"):

class MyNewException(Exception):

def myfunction():
    raise MyNewException("Oh no!")

def main():
    except MyNewException:
        print("Successfully handled MyNewException")

if __name__=="__main__":

Exception Handling

This is a useful pattern for exception handling: if you need to use a try/except block, and you want to have a block that's run if the exception does NOT occur, you can add an "else" to the block.

For example, if we are writing a method for one class that is wrapping an instance of another class, we can transparently provide access to the instance's attributes with the following:

(here, oInstance is the object instance that we are wrapping)

    class Wrapper(object):

        def __getattribute__(self,s):
            If an attribute of Wrapper is accessed, call this.
            Try to get the attribute from Wrapper,
            and if that fails, try to get it from oInstance.

            Also, detect if it is an instance method,
            just to show off.
                x = super(Wrapper,self).__getattribute__(s)
            except AttributeError:      
                # Here is the "else" in a try/except block
                return x

            # We only get here if we encountered the exception
            x = self.oInstance.__getattribute__(s)

            # Before we return: detect if this is an instance method
            if type(x)==type(self.__init):
                print("Congratulations, you have a method")

            # Okay on with the show
            return x


Exceptions are the anti-pattern:


See: StacksQueues/Python/ArrayStack#Class_implementation