Raising Errors
It is possible to tell Python to generate an error. This is useful if you want to verify input to a function or stop your code running when something happens that your code does not know how to process.
Take this very simple function for example. This function is only designed to be used with numbers, so we want to make sure we dont pass a string.
def square(x):
if isinstance(x, str):
raise ValueError("the argument x can not be a string")
else:
return x**2
The function works as expected with a number:
square(10)
100
When it is passed a string it raises an error, telling the user that the argument x can not be a string.
square("aksdj")
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-3-0c38ed1bd00a> in <module>()
----> 1 square("aksdj")
<ipython-input-1-1e7b36c66a9f> in square(x)
1 def square(x):
2 if isinstance(x, str):
----> 3 raise ValueError("the argument x can not be a string")
4 else:
5 return x**2
ValueError: the argument x can not be a string
You can raise many different kinds of exception, however ValueError
is generally the most useful. Other useful types of error are:
raise TypeError("This is not a number")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-7cceb7db3229> in <module>()
----> 1 raise TypeError("This is not a number")
TypeError: This is not a number
raise FileNotFoundError("This is not a file")
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-5-b933b80c1c6d> in <module>()
----> 1 raise FileNotFoundError("This is not a file")
FileNotFoundError: This is not a file
What Type of Error?
The example above:
def square(x): if isinstance(x, str): raise ValueError("x can not be a string") else: return x**2
uses ValueError
, what type of error would be more appropriate?
Solution
TypeError
should be raised when the type (i.e. str
, float
, int
) is incorrect.
Silent Errors
Not all programming errors raise an exception, some are errors in the functioning of the code. i.e. this:
def square(x):
return x**3
square(10)
1000
This is obviously incorrect, but Python does not know any difference, it executes the code as written and returns a result.
Most logical errors or “bugs” like this are not so easy to spot! As the complexity of your code increases the odds that mistakes and errors creep in increases. The best way to detect and prevent this kind of error is by writing tests.