When is a function try block useful?

后端 未结 6 1500
忘了有多久
忘了有多久 2020-11-30 06:31

I\'m wondering when programmers use function try blocks. When is it useful?

void f(int i)
try
{
   if ( i  < 0 ) 
      throw \"less than zero\";
   std::         


        
6条回答
  •  醉梦人生
    2020-11-30 06:55

    Notes regarding how function try blocks operate:

    • For constructors, a function try block encompasses the construction of data members and base-classes.

    • For destructors, a function try block encompasses the destruction of data members and base-classes. It gets complicated, but for C++11, you have to include noexcept(false) in the declaration of your destructor (or that of a base/member class) or any destruction exception will result in termination at the conclusion of the catch block. It may be possible to prevent this by putting a return statement in the catch block (but this won't work for constructors).

    • A catch block in a constructor or destructor must throw some exception (or it will implicitly rethrow the caught exception). It is not legal to simply return (at least in constructor's function catch block). Note, however, that you could call exit() or similar, which might make sense in some situations.

    • A catch block can't return a value, so it doesn't work for functions returning non-void (unless they intentionally terminate the program with exit() or similar). At least that is what I've read.

    • The catch block for a constructor-function-try can't reference data/base members since they will have either have 1) not been constructed or 2) been destructed prior to the catch. As such, function try blocks are not useful for cleaning up an object's internal state -- the object should already be completely "dead" by the time you get there. This fact makes it very dangerous to use function try blocks in constructors, since it is difficult to police this rule over time if your compiler(s) don't happen to flag it.

    valid (legal) uses

    • Translating an exception (to a different type/message) thrown during the constructor or it's base/member constructors.
    • Translating or absorbing and exception thrown during the destructor or it's base/member destructors (destructor etiquette notwithstanding).
    • Terminating a program (perhaps with a useful message).
    • Some kind of exception logging scheme.
    • Syntactic sugar for void-returning functions that happen to need a fully encapsulating try/catch block.

提交回复
热议问题