Should we care the possibility fp(watcherCtx) function raise exception, we should use try/catch or smart pointer?
or, we promise to make the passed watcher function never raise exceptions.