@@ -422,9 +422,12 @@ def get_manager_state(cls, drop_defaults=False, widgets=None):
422422 """
423423 state = {}
424424 if widgets is None :
425- widgets = _widget_instances .values ()
425+ widgets = tuple ( _widget_instances .values () )
426426 for widget in widgets :
427- state [widget .model_id ] = widget ._get_embed_state (drop_defaults = drop_defaults )
427+ try :
428+ state [widget .model_id ] = widget ._get_embed_state (drop_defaults = drop_defaults )
429+ except Exception :
430+ pass
428431 return {'version_major' : 2 , 'version_minor' : 0 , 'state' : state }
429432
430433 def _get_embed_state (self , drop_defaults = False ):
@@ -621,7 +624,24 @@ def get_state(self, key=None, drop_defaults=False):
621624 traits = self .traits ()
622625 for k in keys :
623626 to_json = self .trait_metadata (k , 'to_json' , self ._trait_to_json )
624- value = to_json (getattr (self , k ), self )
627+ try :
628+ value = to_json (getattr (self , k ), self )
629+ except RuntimeError as e :
630+ if k == "children" and isinstance ((children := getattr (self , k )), tuple ):
631+ # A special case to handle invalid children
632+ children_ = []
633+ for c in children :
634+ try :
635+ to_json (c , self )
636+ except Exception :
637+ self .log .debug ("Dropping invalid child item:%r" , c )
638+ continue
639+ else :
640+ children_ .append (c )
641+ value = to_json (children_ , self )
642+ else :
643+ self .log .exception ("Unable to trait %s from %r" , k , self , exc_info = e )
644+ continue
625645 if not drop_defaults or not self ._compare (value , traits [k ].default_value ):
626646 state [k ] = value
627647 return state
0 commit comments