Python handling the name error exception
I wrote a small code and tried to handle the name error exception. I want to print a custom message even if there is an exception, but it is showing the complete the trace back.
#!/usr/bin/python -tt import logging def equaldigits(a, b): logging.basicConfig(filename='run.log',level=logging.INFO) try: c = a - b logging.info('%s is the difference between both the digits', str(c)) print c return c except NameError as e: c = 'Unable to successfully complete execution' logging.info(c) print c #return c def main(): print '\n1st call' equaldigits(10, 10) print '\n2nd call' equaldigits(1, 0) print '\nException call' equaldigits(a, 0) # Standard boilerplate to call the main() function. if __name__ == '__main__': main()
This is the console output
1st call 0 2nd call 1 Exception call Traceback (most recent call last): File "./sut.py", line 28, in <module> main() File "./sut.py", line 24, in main equaldigits(a, 0) NameError: global name 'a' is not defined
In your attempt to catch an exception, you wrote equaldigits(a, 0). The interpreter sees the a and thinks it is a variable that isn't there, thus throwing the uncaught exception. In order to test your try/catch, you need to pass the letter a, like so
equaldigits('a', 0) ^ ^ note the quotes
The problem isn't happening within your equaldigits function where you have your logging information.
Its happening in your main function when the interpreter tries to pass the value of a to equaldigits. The variable a doesn't exist within the local scope of main, thus Python tries to find a global variable named a. Since it doesn't see one, it throws a NameError.
Your error is caused by the fact that a is not defined when you call equaldigits, the execution doesn't get to the try/except clause inside the function.
when you change
a - b
a - d
inside the function you'll see that your try/except works fine