Q: When is it worth it to write exception specifications on functions? Why would you choose to write one, or why not?
A: In brief, don't bother. Even experts don't bother.
Slightly less briefly, the major issues are:
Exception specifications can cause surprising performance hits, for example if the compiler turns off inlining for functions with exception specifications.
A runtime unexpected() error is not always what you want to have happen for the kinds of mistakes that exception specifications are meant to catch.
You generally can't write useful exception specifications for function templates anyway because you generally can't tell what the types they operate on might throw.
For more, see for example the Boost exception specification rationale available via
http://www.gotw.ca/publications/xc++s/boost_es.htm (it summarizes to "Don't!").