Search code examples
python-3.xopencvexceptionnonetype

Declaring None type exception


I want to define a custom Exception class for the NoneType error in python inheriting from Exception class. I expect the code below to do such a thing for me but no success. Is there any way to do this?

    class NoneTypeException(Exception):
        pass

    try:
         image = cv2.imread("/path/")
         gray = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY) #exception should be raised here
         ...

    except NoneTypeException:
        raise NoneTypeException("Image not found") # and should be caught here

I want to the try except block raise the NoneTypeException. Any way?


Solution

  • While you can declare an exception to represent whatever you want, existing code won't raise it for you. In specific, operations on None already raise some well-defined errors and you cannot replace them. Strictly speaking, you cannot get the desired behaviour.


    If you know that a certain section of code is vulnerable to None values, you can catch the generic Exception and raise a specific one. This hinges on the assumption that None is the only bogus value you might get:

    class NoneTypeException(Exception):
        pass
    
    try:
         image = cv2.imread("/path/")
         gray = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY)
         ...
    except AttributeError as err:  # handle generic exception from action on ``None``
        raise NoneTypeException("Image not found")
    

    Take note that this is rarely what you should be doing - the None value is a symptom, not the cause of the error. It would be more appropriate to raise a FileNotFoundError.


    Since None can trigger errors anywhere, it is easier to protect against it at its origin. Checking for identity with None is very cheap:

    try:
        image = cv2.imread("/path/")
        if image is None:  # verify value immediately
            raise NoneTypeException()
        # safely work with image
        gray = cv2.cvtColor(image.copy(), cv2.COLOR_BGR2GRAY)
        ...
    except NoneTypeException:
        raise FileNotFoundError('image not found')