This post is about very basics of exceptional handling .
Exceptions - It is a type of error if not taken care of then code may crash . To avoid crash and handle at programmer level we handle the exceptions (or know error/issues) .
eg :
def factorial (n):
if n<=1:
return 1
else:
return n*factorial(n-1)
print(factorial(10000))
O/P :
---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
<ipython-input-6-82c3e39cc340> in <module>
5 return n*factorial(n-1)
6
----> 7 print(factorial(10000))
<ipython-input-6-82c3e39cc340> in factorial(n)
3 return 1
4 else:
----> 5 return n*factorial(n-1)
6
7 print(factorial(10000))
... last 1 frames repeated, from the frame below ...
<ipython-input-6-82c3e39cc340> in factorial(n)
3 return 1
4 else:
----> 5 return n*factorial(n-1)
6
7 print(factorial(10000))
RecursionError: maximum recursion depth exceeded in comparison
Here RecursionError is an error occurred which crashed the code .
We can handle these kinds of error to not crash code (For this we use try and except block ) :
eg :
def factorial (n):
if n<=1:
return 1
else:
return n*factorial(n-1)
try :
print(factorial(10000))
except RecursionError:
print("Program cannot handle this much data")
## This would be printed post try and except block (in case of failure/success below command would be printed ).
print("Program ENDED")
O/P:
Program cannot handle this much data
Program ENDED
Handling multiple exceptions using different except block :
## Multiple exceptions
def factorial (n):
if n<=1:
return 1
else:
print(n/0)
return n*factorial(n-1)
try :
print(factorial(10000))
except RecursionError:
print("Program cannot handle this much data")
except ZeroDivisionError:
print("Divide by 0 is not possible")
print("Program ENDED")
O/P :
Divide by 0 is not possible
Program ENDED
eg : Multiple exceptions with same error
## Multiple exceptions with same error message
def factorial (n):
if n<=1:
return 1
else:
print(n/0)
return n*factorial(n-1)
try :
print(factorial(10000))
except (RecursionError , ZeroDivisionError):
print("Either there is too much \
data or you are diving with 0")
O/P :
Either there is too much data or you are diving with 0
Finally
Sometimes it is necessary to run a code whether exception occurred or not ie code in finally block will always execute .
For example in case of database transactions we need to close the connection irrespective of any failure or success .
eg :
def factorial (n):
if n<=1:
return 1
else:
#print(n/0)
return n*factorial(n-1)
try :
print(factorial(10))
except (RecursionError , ZeroDivisionError):
print("Either there is too much \
data or you are diving with 0")
finally :
print("This will always run")
O/P :
3628800
This will always run
ELSE in try/except :
In case we want to execute something in case there is no exception raise we can use else block .
eg :
def factorial (n):
if n<=1:
return 1
else:
return n*factorial(n-1)
try :
print(factorial(10))
except (RecursionError , ZeroDivisionError):
print("Either there is too much \
data or you are diving with 0")
else :
print("This will run in case no exception")
O/P:
3628800
This will run in case no exception
In Python exceptions are objects & must be derived from a class .
Also there is an option to catch every exception using Exceptions only which must be included in last post all except block.
eg:
## Catch every exception
def factorial (n):
if n<=1:
return 1
else:
#print(n/0)
return n*factorial(n-1)
try :
print(factorial(10000))
except ZeroDivisionError:
print("Divide by 0 is not possible")
except Exception:
print("In case of any exception\
which is not given above this is called")
O/P:
In case of any exception which is not given above this is called
Raising an exception :
The raise statement allows the programmer to force a specified exception to occur at any point of code.
eg:
def factorial (n):
if n<=1:
return 1
else:
#print(n/0)
return n*factorial(n-1)
print(factorial(10))
raise Exception("Sorry, no numbers below zero")
O/P :
3628800
--------------------------------------------------------------------------- Exception Traceback (most recent call last) <ipython-input-42-8a9696b5ab95> in <module> 9 10 print(factorial(10)) ---> 11 raise Exception("Sorry, no numbers below zero") Exception: Sorry, no numbers below zero
User Defined Exceptions :
Programs may name their own exceptions by creating a new exception class .Exception should typically be derived fro Exception class ,either directly or indirectly .
Eg :
## User-Defined Exceptions
class User_Error(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return(repr(self.value))
try:
raise(User_Error("We can type in any new error details here !"))
except User_Error as error:
print('A New Exception occurred:',error.value)
O/P :
A New Exception occurred: We can type in any new error details here !
This was introduction to Exception handling in Python .
Comments