When it came to implementing this in Kazoo, upon disconnect I flag the session watcher to indicate it was gone. AFAIK the C client will call all watches and indicate there was a disconnect state, at which point they have to then attempt to re-do their operation and set a new watch. Existing watches will not be called to indicate the connection was lost (which the default Zookeeper client does, with Kazoo I ask the developer to register a client listener if they're interested in this event).
The docs state that the 'client' will re-register watches upon reconnection. This is not the behavior that I observed last time I used the C client, I can't speak to what the Java client does. I'd like Kazoo to meet the same requirements so I'm curious if there could be some agreement on what exactly the client should/shouldn't do regarding a watch.