micropython unexpected result



  • OK programming gurus I expected

    old_error=0
    def _logerrorin(error):
        global old_error
        print('old_error =', old_error)
        print('new_error =', error)
        if error!=old_error: print('a new error')
        old_error=error
    
    for i in range(2):
      try:
        1/0
      except Exception as e: _logerrorin(e)
    

    to print 'a new error' just once, but I actually get

    old_error = 0
    new_error = divide by zero
    a new error
    old_error = divide by zero
    new_error = divide by zero
    a new error
    

    Can someone tell me what I'm doing wrong?



  • @kjm e is an instance of the class <class 'ZeroDivisionError'>. With every new Exception raised, you create a new instance. Both instances have a different id. In MicroPython as well a Python, class instances are equal if their id is the same, which is not the case here.
    If that logic is important for you, you can for instance compare the types in line 6:
    if type(error) != type(old_error): print('a new error')



  • @johand Indeed you are correct.

    As new_error and old_error are Objects, comparing them directly will result in that they are different all the time.

    Thus, as you suggested one may want to compare the string or something else that Exception throws.



  • I am guessing a bit now... Looks like you are compairing two different Exception-objects, they are not the same. You most likley want to compare the description string of the exceptions.

    Not sure if this is the correct way, but you should get an idea of what to do:

    if str(error)!=str(old_error): print('a new error')

    Johan


Log in to reply
 

Pycom on Twitter