On 10/26/2016 1:04 PM, Jędrzej Dudkiewicz wrote:
I believe that it is the opposite: library is throwing the old one and
you are catching new one. This is my understanding of it.
So catching 'std::ios_base::failure' is actually catching
'std::ios_base::failure[abi:cxx11]' ?
On Wed, Oct 26, 2016 at 6:46 PM, Edward Diener
<eldlistmailingz@xxxxxxxxxxxxxx> wrote:
On 10/26/2016 10:57 AM, Jonathan Wakely wrote:
On 26 October 2016 at 14:42, Edward Diener wrote:
I am missing the syntactical difference between the two. There is
'std::ios_base::failure' and how do you specify the other one ? Your
notation of 'std::ios_base::[abi:__cxx11]failure' I do not understand.
It comes from the abi_tag attribute documented at
https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
namespace std {
struct ios_base {
struct __attribute__((abi__tag__("cxx11"))) failure { };
};
}
I got the demangled name slightly wrong, the attribute goes at the end:
#include <iostream>
int main()
{
throw std::ios_base::failure("");
}
terminate called after throwing an instance of
'std::ios_base::failure[abi:cxx11]'
what(): : iostream error
Aborted (core dumped)
I am syntactically catching 'std::ios::failure'. Are you saying that the
exception being thrown in my OP is actually
'std::ios_base::failure[abi:cxx11]' ? I am still a bit confused when you
said in a previous reply:
"You're trying to catch the new one, but the library throws the old
one."