- Python Custom Exception
- Introduction to the Python custom exception
- Python custom exception example
- Define the FahrenheitError custom exception class
- Define the fahrenheit_to_celsius function
- Create the main program
- Put it all together
- Summary
- Python Custom Exceptions
- Raise Exceptions
- Defining Custom Exceptions
- 1. Create a Custom Exception Class
- 2. Add a custom Message and Error
- Conclusion
- References
Python Custom Exception
Summary: in this tutorial, you’ll learn how to define Python custom exception classes.
Introduction to the Python custom exception
To create a custom exception class, you define a class that inherits from the built-in Exception class or one of its subclasses such as ValueError class:
The following example defines a CustomException class that inherits from the Exception class:
class CustomException(Exception): """ my custom exception class """
Code language: Python (python)
Note that the CustomException class has a docstring that behaves like a statement. Therefore, you don’t need to add the pass statement to make the syntax valid.
To raise the CustomException, you use the raise statement. For example, the following uses the raise statement to raise the CustomException :
class CustomException(Exception): """ my custom exception class """ try: raise CustomException('This is my custom exception') except CustomException as ex: print(ex)
Code language: Python (python)
This is my custom exception
Code language: Python (python)
Like standard exception classes, custom exceptions are also classes. Hence, you can add functionality to the custom exception classes like:
- Adding attributes and properties.
- Adding methods e.g., log the exception, format the output, etc.
- Overriding the __str__ and __repr__ methods
- And doing anything else that you can do with regular classes.
In practice, you’ll want to keep the custom exceptions organized by creating a custom exception hierarchy. The custom exception hierarchy allows you to catch exceptions at multiple levels, like the standard exception classes.
Python custom exception example
Suppose you need to develop a program that converts a temperature from Fahrenheit to Celsius.
The minimum and maximum values of a temperature in Fahrenheit are 32 and 212. If users enter a value that is not in this range, you want to raise a custom exception e.g., FahrenheitError .
Define the FahrenheitError custom exception class
The following defines the FahrenheitError exception class:
class FahrenheitError(Exception): min_f = 32 max_f = 212 def __init__(self, f, *args): super().__init__(args) self.f = f def __str__(self): return f'The is not in a valid range '
Code language: Python (python)
- First, define the FahrenheitError class that inherits from the Exception class.
- Second, add two class attributes min_f and max_f that represent the minimum and maximum Fahrenheit values.
- Third, define the __init__ method that accepts a Fahrenheit value ( f ) and a number of position arguments ( *args ). In the __init__ method, call the __init__ method of the base class. Also, assign the f argument to the f instance attribute.
- Finally, override the __str__ method to return a custom string representation of the class instance.
Define the fahrenheit_to_celsius function
The following defines the fahrenheit_to_celsius function that accepts a temperature in Fahrenheit and returns a temperature in Celcius:
def fahrenheit_to_celsius(f: float) -> float: if f < FahrenheitError.min_f or f > FahrenheitError.max_f: raise FahrenheitError(f) return (f - 32) * 5 / 9
Code language: Python (python)
The fahrenheit_to_celsius function raises the FahrenheitError excpetion if the input temperature is not in the valid range. Otherwise, it converts the temperature from Fahrenheit to Celcius.
Create the main program
The following main program uses the fahrenheit_to_celsius function and the FahrenheitError custom exception class:
if __name__ == '__main__': f = input('Enter a temperature in Fahrenheit:') try: f = float(f) except ValueError as ex: print(ex) else: try: c = fahrenheit_to_celsius(float(f)) except FahrenheitError as ex: print(ex) else: print(f' Fahrenheit = .4f> Celsius')
Code language: Python (python)
First, prompt users for a temperature in Fahrenheit.
f = input('Enter a temperature in Fahrenheit:')
Code language: Python (python)
Second, convert the input value into a float. If the float() cannot convert the input value, the program will raise a ValueError exception. In this case, it displays the error message from the ValueError exception:
try: f = float(f) # . except ValueError as ex: print(ex)
Code language: Python (python)
Third, convert the temperature to Celsius by calling the fahrenheit_to_celsius function and print the error message if the input value is not a valid Fahrenheit value:
try: c = fahrenheit_to_celsius(float(f)) except FahrenheitError as ex: print(ex) else: print(f' Fahrenheit = .4f> Celsius')
Code language: Python (python)
Put it all together
class FahrenheitError(Exception): min_f = 32 max_f = 212 def __init__(self, f, *args): super().__init__(args) self.f = f def __str__(self): return f'The is not in a valid range ' def fahrenheit_to_celsius(f: float) -> float: if f < FahrenheitError.min_f or f > FahrenheitError.max_f: raise FahrenheitError(f) return (f - 32) * 5 / 9 if __name__ == '__main__': f = input('Enter a temperature in Fahrenheit:') try: f = float(f) except ValueError as ex: print(ex) else: try: c = fahrenheit_to_celsius(float(f)) except FahrenheitError as ex: print(ex) else: print(f' Fahrenheit = .4f> Celsius')
Code language: Python (python)
Summary
- Subclass the Exception class or one of its subclasses to define a custom exception class.
- Create a exception class hierarchy to make the exception classes more organized and catch exceptions at multiple levels.
Python Custom Exceptions
An Exception is raised whenever there is an error encountered, and it signifies that something went wrong with the program. By default, there are many exceptions that the language defines for us, such as TypeError when the wrong type is passed. In this article, we shall look at how we can create our own Custom Exceptions in Python.
But before we take a look at how custom exceptions are implemented, let us find out how we could raise different types of exceptions in Python.
Raise Exceptions
Python allows the programmer to raise an Exception manually using the raise keyword.
Format: raise ExceptionName
The below function raises different exceptions depending on the input passed to the function.
def exception_raiser(string): if isinstance(string, int): raise ValueError elif isinstance(string, str): raise IndexError else: raise TypeError
>>> exception_raiser(123) Traceback (most recent call last): File "", line 1, in File "", line 3, in exception_raiser ValueError >>> exception_raiser('abc') Traceback (most recent call last): File "", line 1, in File "", line 5, in exception_raiser IndexError >>> exception_raiser([123, 456]) Traceback (most recent call last): File "", line 1, in File "", line 7, in exception_raiser TypeError
As you can observe, different types of Exceptions are raised based on the input, at the programmer’s choice. This allows for good flexibility of Error Handling as well, since we can actively predict why an Exception can be raised.
Defining Custom Exceptions
Similarly, Python also allows us to define our own custom Exceptions. We are in complete control of what this Exception can do, and when it can be raised, using the raise keyword. Let us look at how we can define and implement some custom Exceptions.
1. Create a Custom Exception Class
We can create a custom Exception class to define the new Exception. Again, the idea behind using a Class is because Python treats everything as a Class. So it doesn’t seem that outlandish that an Exception can be a class as well!
All Exceptions inherit the parent Exception Class, which we shall also inherit when creating our class.
We shall create a Class called MyException , which raises an Exception only if the input passed to it is a list and the number of elements in the list is odd.
class MyException(Exception): pass def list_check(lst): if len(lst) % 2 != 0: raise MyException # MyException will not be raised list_check([1, 2, 3, 4]) # MyException will be raised list_check([1, 3, 5])
[email protected]:~# python3 exceptions.py Traceback (most recent call last): File "exceptions.py", line 12, in list_check([1, 3, 5]) File "exceptions.py", line 6, in list_check raise MyException __main__.MyException
2. Add a custom Message and Error
We can add our own error messages and print them to the console for our Custom Exception. This involves passing two other parameters in our MyException class, the message and error parameters.
Let us modify our original code to account for a custom Message and Error for our Exception.
class MyException(Exception): def __init__(self, message, errors): # Call Exception.__init__(message) # to use the same Message header as the parent class super().__init__(message) self.errors = errors # Display the errors print('Printing Errors:') print(errors) def list_check(lst): if len(lst) % 2 != 0: raise MyException('Custom Message', 'Custom Error') # MyException will not be raised list_check([1, 2, 3, 4]) # MyException will be raised list_check([1, 3, 5])
Printing Errors: Custom Error Traceback (most recent call last): File "exceptions.py", line 17, in list_check([1, 3, 5]) File "exceptions.py", line 11, in list_check raise MyException('Custom Message', 'Custom Error') __main__.MyException: Custom Message
We have thus successfully implemented our own Custom Exceptions, including adding custom error messages for debugging purposes! This can be very useful if you are building a Library/API and another programmer wants to know what exactly went wrong when the custom Exception is raised.
Conclusion
In this article, we learned how to raise Exceptions using the raise keyword, and also build our own Exceptions using a Class and add error messages to our Exception.