Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python: how to get up until the last error made by my code

So when I run this... the error is on this line bomb=pd.DataFrame(here,0) but the trace shows me a bunch of code from the pandas library to get to the error.

import traceback,sys
import pandas as pd        

def error_handle(err_var,instance_name=None): #err_var list of variables, instance_name
    print(traceback.format_exc())
    a= sys._getframe(1).f_locals

    for i in err_var: # selected var for instance
        t= a[instance_name]
        print i,"--->",getattr(t,i.split(".")[1])



here=['foo']

err_var = ['self.needthisone','self.constant2']
class test:

    def __init__(self):
        self.constant1 = 'hi1'
        #self.constant2 = 'hi2'
        #self.needthisone = ':)'
        for i in err_var:
            setattr(self, i.split('.')[1], None)

    def other_function(self):
        self.other_var=5

    def testing(self):
        self.other_function()
        vars=[self.constant1,self.constant2]

        try:
            for i in vars: 
                bomb=pd.DataFrame(here,0)

        except:
            error_handle(err_var,'self')

t=test()
t.testing()    

How do I suppress all that and have the error just look like this:

Traceback (most recent call last):
  File "C:\Users\Jason\Google Drive\python\error_handling.py", line 34, in testing
    bomb=pd.DataFrame(here,0)
TypeError: Index(...) must be called with a collection of some kind, 0 was passed

I just want what's relevant to me and the last line of code that I wrote which was bad.

This is the original:

Traceback (most recent call last):
  File "C:\Users\Jason\Google Drive\python\error_handling.py", line 35, in testing
    bomb=pd.DataFrame(here,0)
  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 330, in __init__
    copy=copy)
  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 474, in _init_ndarray
    index, columns = _get_axes(*values.shape)
  File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 436, in _get_axes
    index = _ensure_index(index)
  File "C:\Python27\lib\site-packages\pandas\core\indexes\base.py", line 3978, in _ensure_index
    return Index(index_like)
  File "C:\Python27\lib\site-packages\pandas\core\indexes\base.py", line 326, in __new__
    cls._scalar_data_error(data)
  File "C:\Python27\lib\site-packages\pandas\core\indexes\base.py", line 678, in _scalar_data_error
    repr(data)))
TypeError: Index(...) must be called with a collection of some kind, 0 was passed

self.needthisone ---> None
self.constant2 ---> None
like image 770
jason Avatar asked Aug 01 '18 16:08

jason


People also ask

How do you go back to a specific line in Python?

Python does not allow you to go back to a specific line number, and even if it did, you should not take advantage of that capability because it results in unmaintainable programs. Instead, learn how to use functions and structure your code so that functions make sense.

What is traceback most recent call last in Python?

Traceback (most recent call last)?This program is supposed to accept a number and print out all the numbers up to and including that number. When Python encounters an exception that isn't handled in your code, it will print out a traceback.

How do I print exceptions in Python?

If you are going to print the exception, it is better to use print(repr(e)) ; the base Exception. __str__ implementation only returns the exception message, not the type. Or, use the traceback module, which has methods for printing the current exception, formatted, or the full traceback.


2 Answers

You can define how far back a traceback goes using the sys.traceback variable. If your code is only 3 levels deep, (a function in a class in a file), then you can define this appropriately with the code:

sys.tracebacklimit = 3

at the top of your file. BE CAREFUL WITH THIS: As you write more code, the portion that you've written will become deeper and deeper, and you may sometime soon find that an error is a result of something deeper in the traceback. As a general rule, I would avoid using the variable and just deal with a longer traceback for the time being.

like image 147
GetHacked Avatar answered Oct 21 '22 05:10

GetHacked


Please, don't ever think about limiting the stack trace. It is very important. Only at this moment, in this small example of yours, the error really is in your code.

But in an infinite other cases, an error could be triggered much deeper than that. It could be in the framework, or even out of the code whatsoever, like a configuration error, or it could be in the platform, like an Out of Memory error, etc.

The stack trace is there to help you. It lists all frames the compiler was executing, to give you all the info you need to understand what was going on.

like image 4
rsalmei Avatar answered Oct 21 '22 05:10

rsalmei