2013-10-25 4 views
0

Когда я запускаю этот код:программы Regex не ловли исключения, другие проблемы

#include <iostream> 
#include <regex> 

using namespace std; 

main() { 
    const string source = "hello(abc_def)"; 
    const regex regexp("he(l)lo.*"); 
    smatch m; 
    if (regex_match(source, m, regexp)) { 
     cout << "Found, group 1 = " << m[1].str() << endl; 
    } else { 
     cout << "Not found" << endl; 
    } 
    const regex regexp2("hello\\((\\w+)\\)"); 
    try { 
     if (regex_match(source, m, regexp2)) { 
      cout << "Found, group 1 = " << m[1].str() << endl; 
     } else { 
      cout << "Not found" << endl; 
     } 
    } catch(const exception& exc) { 
     cout << "Got exception: " << exc.what() << endl; 
    } 
} 

вывод:

Found, group 1 = el 
terminate called after throwing an instance of 'std::regex_error' 
    what(): regex_error 

сопровождается диалогового окна, которое разбивая программы. Я использую g ++ в Windows, 4.8.1 (да, я указал -std=c++11), и я понимаю, что материал регулярного выражения все еще был экспериментальным до 4.9, так что это могло объяснить, почему первая группа захвата неверна и почему она могла быть проблема со вторым регулярным выражением. Я все еще обеспокоен тем, почему он сказал, что он бросает std::regex_error, но мой код не поймал его. Изменение exception& до regex_error& в предложении catch не изменило поведения. Все эти ошибки библиотеки, или я сделал что-то неправильно? Я пытаюсь выучить C++ после того, как не использовал его в течение 15 лет или около того (а также пытаюсь изучить C++ 11), поэтому я обеспокоен тем, что мог сделать что-то немое.

ответ

1

Исключение происходит в этой строке:

const regex regexp2("hello\\((\\w+)\\)");

И эта линия не находится внутри блока "Try-Catch".

+0

ОК, спасибо. Это выглядит глупой ошибкой с моей стороны, но, с другой стороны, он-лайн ссылки на C++, которые я нашел, даже не упоминают о возможности бросать regex_error, не говоря уже о том, чтобы сказать мне, в какой момент он будет выброшен, поэтому Я не мог сказать. – ajb

Смежные вопросы