On 26 October 2016 at 17:46, Edward Diener 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." I meant exactly that. You're trying to catch the new type, which has a std::system_error base class and is decorated with __attribute__((__abi_tag__("cxx11"))), but the library throws the old type, which is not decorated with the attribute.