In Python Exception Handling - try,except,finally we saw some examples of exception handling in Python but exceptions, in all the examples there, were thrown automatically. You can throw an exception manually too using raise statement in Python.
Python raise statement
For throwing an exception using raise there are the following options-
1. You can simply use raise without any other expression. If no expressions are present, raise re-raises the last exception that was active in the current scope. If no exception is active in the current scope, a RuntimeError exception is raised indicating that this is an error.
def divide_num(num1, num2): try: print('Result-',num1/num2) except ZeroDivisionError as error: print('Zero is not a valid argument here') #raise with no expression raise divide_num(10, 0)
Output
Zero is not a valid argument here Traceback (most recent call last): File "F:/NETJS/NetJS_2017/Python/Programs/Test.py", line 10, in <module> divide_num(10, 0) File "F:/NETJS/NetJS_2017/Python/Programs/Test.py", line 3, in divide_num print('Result-',num1/num2) ZeroDivisionError: division by zero
As you can see raise statement re-raises the last exception again.
2. If raise is used with an expression then raise evaluates the first expression as the exception object. It must be either a subclass or an instance of BaseException. If it is a class, the exception instance will be obtained when needed by instantiating the class with no arguments.
def divide_num(num1, num2): try: print('Result-',num1/num2) except ZeroDivisionError as error: print('Zero is not a valid argument here') raise RuntimeError("An error occurred") divide_num(10, 0)
Output
Zero is not a valid argument here Traceback (most recent call last): File "F:/NETJS/NetJS_2017/Python/Programs/Test.py", line 3, in divide_num print('Result-',num1/num2) ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "F:/NETJS/NetJS_2017/Python/Programs/Test.py", line 9, in <module> divide_num(10, 0) File "F:/NETJS/NetJS_2017/Python/Programs/Test.py", line 6, in divide_num raise RuntimeError("An error occurred") RuntimeError: An error occurred
As you can see in this case previous exception is attached as the new exception’s __context__ attribute.
3. raise can also be used with from clause for exception chaining. With the from clause another exception class or instance is given, which will then be attached to the raised exception as the __cause__ attribute.
In the example there are two functions, from function func() there is a call to function divide_num with arguments that cause ZeroDivisionError.
def divide_num(num1, num2): try: print('Result-',num1/num2) except ZeroDivisionError as error: print('Zero is not a valid argument here') raise RuntimeError("An error occurred") from error def func(): try: divide_num(10, 0) except RuntimeError as obj: print(obj) print(obj.__cause__) func()
Output
Zero is not a valid argument here An error occurred division by zero
As you can see using __cause__ attribute you can get the attached exception.
That's all for this topic raise Statement in Python Exception Handling. If you have any doubt or any suggestions to make please drop a comment. Thanks!
>>>Return to Python Tutorial Page
Related Topics
You may also like-