Question

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
Was it helpful?

Solution

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

OTHER TIPS

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 

to

a - d

inside the function you'll see that your try/except works fine

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top