Locating the line number where an exception occurs

2020-02-10 05:12发布

I have a code similar to this:

try:
  if x:
      statement1
      statement2
      statement3
  elif y:
      statement4
      statement5
      statement6
  else:
      raise

except:
      statement7

Here, I am sure that the exception occurs in If x: block, but I would like to know in which statement of If x: block the exception occurs. Is there a way to get the line number where the exception occurs?

Regards,

10条回答
我欲成王,谁敢阻挡
2楼-- · 2020-02-10 05:23

Edit your source code, so that you remove one line at a time, until the error disappears, and that should point you closer to the problem.

查看更多
SAY GOODBYE
3楼-- · 2020-02-10 05:28

what about this:

try:
  if x:
      print 'before statement 1'
      statement1
      print 'before statement 2' #ecc. ecc.
      statement2
      statement3
  elif y:
      statement4
      statement5
      statement6
  else:
      raise

except:
      statement7

this is the straightforward workaround but I suggest to use a debugger

or even better, use the sys module :D

try:
      if x:
          print 'before statement 1'
          statement1
          print 'before statement 2' #ecc. ecc.
          statement2
          statement3
      elif y:
          statement4
          statement5
          statement6
      else:
          raise
except:
    print sys.exc_traceback.tb_lineno 
    #this is the line number, but there are also other infos
查看更多
地球回转人心会变
4楼-- · 2020-02-10 05:28

If you restructure the code like so, you should get a line number when the exception is raised again:

except:
    statement7
    raise
查看更多
干净又极端
5楼-- · 2020-02-10 05:30

Building on JJ above..

The advantage of using system errors over statements is they record more specific information which will aid debugging later (believe me I get a lot)

eg. I record them to a text file, so after my programs have automatically run overnight on the server, I can retrieve any issues, and have enough information to quicken the repair!

More Info... Traceback & Sys

import traceback
import sys

try:
    print 1/0

except Exception as e:
    print '1', e.__doc__
    print '2', sys.exc_info()
    print '3', sys.exc_info()[0]
    print '4', sys.exc_info()[1]
    print '5', sys.exc_info()[2], 'Sorry I mean line...',traceback.tb_lineno(sys.exc_info()[2])
    ex_type, ex, tb = sys.exc_info()
    print '6', traceback.print_tb(tb)

Yields

>  1  Second argument to a division or modulo operation was zero. 
>  2  (<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division
>      or modulo by zero',), <traceback object at 0x022DCF30>) 
>  3  <type 'exceptions.ZeroDivisionError'> 
>  4  integer division or modulo by zero 
>  5  <traceback object at 0x022DCF30> Sorry I mean line... 5
>  6  File "Z:\Programming\Python 2.7\Error.py", line 5, in <module>
>     print 1/0 
      None
>>>
查看更多
不美不萌又怎样
6楼-- · 2020-02-10 05:32

Using a general except statement is usually a bad programming practice, so you should specify in your except statement what exception you want to catch. ( like except ValueError: )

Moreover, you should surround with a try except structure the bits of code that are supposed to be raising an exception.

查看更多
看我几分像从前
7楼-- · 2020-02-10 05:35

You should wrap the statements you care about more tightly. Extracting the line number from the traceback is going to be involved and fragile.

查看更多
登录 后发表回答