This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of CD1 status.

### 829. current_exception wording unclear about exception type

Section: 17.9.7 [propagation] Status: CD1 Submitter: Beman Dawes Opened: 2008-04-20 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [propagation].

View all issues with CD1 status.

Discussion:

Consider this code:

>     exception_ptr xp;

>     try {do_something(); }

>     catch (const runtime_error& ) {xp = current_exception();}

>     ...

>     rethrow_exception(xp);

Say `do_something()` throws an exception object of type `range_error`. What is the type of the exception object thrown by `rethrow_exception(xp)` above? It must have a type of `range_error`; if it were of type `runtime_error` it still isn't possible to propagate an exception and the exception_ptr/current_exception/rethrow_exception machinery serves no useful purpose.

Unfortunately, the current wording does not explicitly say that. Different people read the current wording and come to different conclusions. While it may be possible to deduce the correct type from the current wording, it would be much clearer to come right out and explicitly say what the type of the referred to exception is.

[ Peter adds: ]

> I don't like the proposed resolution of 829. The normative text is unambiguous that the `exception_ptr` refers to the currently handled exception. This term has a standard meaning, see 14.4 [except.handle]/8; this is the exception that `throw;` would rethrow, see 14.2 [except.throw]/7.

> A better way to address this is to simply add the non-normative example in question as a clarification. The term currently handled exception should be italicized and cross-referenced. A [Note: the currently handled exception is the exception that a throw expression without an operand (14.2 [except.throw]/7) would rethrow. --end note] is also an option.

Proposed resolution:

After 17.9.7 [propagation] , paragraph 7, add the indicated text:

>     exception_ptr current_exception();

> > Returns: `exception_ptr` object that refers to the currently handled exception (14.4 [except.handle]) or a copy of the currently handled exception, or a null `exception_ptr` object if no exception is being handled. If the function needs to allocate memory and the attempt fails, it returns an `exception_ptr` object that refers to an instance of `bad_alloc`. It is unspecified whether the return values of two successive calls to `current_exception` refer to the same exception object. [Note: that is, it is unspecified whether `current_exception` creates a new copy each time it is called. -- end note]

> > Throws: nothing.