try:
# statements that could potentially throw an exception
except:
# Now, you have an exception. What do you want to do?
There are instances where you don't want the script to quit when it encounter an exception and just move on. In this case, you just place a 'pass' stetement in the except clause like this:
try:
# statements that could potentially throw an exception
except:
pass
If there are specific exceptions that you might wish to catch, place it in the except statement as shown below. Without qualifier, the except clause catches everything.
>>> s = 'abc'
>>> b = float(s)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: invalid literal for float(): abc
In the example above, we want to convert a string value to a floating point. Since you don't have numbers in string s, it throws an exception ValueError. You can handle this exception as shown below. As you could see, the exception ValueError was catched and the code inside the except clause was executed. Since the exception was caught in your code, the script went to completion and no 'Traceback' was shown.
>>> try:
... b = float(s)
... except ValueError:
... print 's is not a floating point string'
...
s is not a floating point string
If I have a script that runs via scheduler, I would place statements in the except clause to send me e-mail telling me what went wrong. In that way, I am notified in real-time and need not look on lengthy logs. Below is how I did it.
import smtplib
def emailError(errMsg):
host='mailServerName'
s=smtplib.SMTP(host)
recepients = ['emailAddress1','emailAddress2','emailAddres3' ]
msg = "Subject: Application1 Had some Problems !!!\n\n" + errMsg
s.sendmail('dummyReplyEmailAddress',recepients,msg)
exit(1)
host='mailServerName'
s=smtplib.SMTP(host)
recepients = ['emailAddress1','emailAddress2','emailAddres3'
msg = "Subject: Application1 Had some Problems !!!\n\n" + errMsg
s.sendmail('dummyReplyEmailAddress',recepients,msg)
exit(1)
try:
fin = file("D:\\somewhere\\sysgenid","r")
except:
emailError("Can't open sysgenid file!\nWas it deleted?\n")
fin = file("D:\\somewhere\\sysgenid","r")
except:
emailError("Can't open sysgenid file!\nWas it deleted?\n")
Another area where I find exception handling useful is when you have a backup and would want to shift to that when the primary resource is down. For example, say, you have an Oracle server Ora1 which is your primary source of data for your script and then there is backup server Ora2, and a third backup Ora3, this is how I use exception handling to take advantage of this redundancy:
import cx_Oracle
try:
connection = cx_Oracle.connect('uid/pwd@Ora1')
except:
try:
connection = cx_Oracle.connect('uid/pwd@Ora2')
except:
try:
connection = cx_Oracle.connect('uid/pwd@Ora3')try:
connection = cx_Oracle.connect('uid/pwd@Ora1')
except:
try:
connection = cx_Oracle.connect('uid/pwd@Ora2')
except:
try:
except:
print 'All Oracle servers are down!!! Exiting now ...'
exit(1)
cur = connection.cursor()
cur.execute("Select * from userTable")
Now, if there is at least one Oracle server up, the script may continue without any problems. Better yet, use email to notify yourself if any of the Oracle server is down using the previous example.
No comments:
Post a Comment