import sys class Test(Exception): def check(self, tag): print("%s.__traceback__ before raise: %s" % (tag, [self.__traceback__])) return self def __setattr__(self, name, value): print("Also note that we can't observe %s changing to %s" % (name, value)) return super().__setattr__(name, value) try: raise Test("thing1").check("a") except Exception as a: print("a.__traceback__ after raise : %s" % [a.__traceback__]) try: raise Test("thing2").with_traceback(a.__traceback__).check("b") from a except Exception as b: print("b.__traceback__ after raise : %s" % [b.__traceback__]) # produces output like: # a.__traceback__ before raise: [None] # a.__traceback__ after raise : [] # b.__traceback__ before raise: [] # b.__traceback__ after raise : []