c ++: поймать runtime_error - PullRequest
       41

c ++: поймать runtime_error

6 голосов
/ 21 сентября 2011

Я изучаю c ++ дома и использую rapidxml lib. Я использую утилиты для открытия файлов:

rapidxml::file<char> myfile (&filechars[0]);

Я заметил, что если filechars не так, rapidxml::file выдает ошибку runtime_error:

// Open stream
basic_ifstream<Ch> stream(filename, ios::binary);
if (!stream)
  throw runtime_error(string("cannot open file ") + filename);
stream.unsetf(ios::skipws);

Я думаю, мне нужно написать что-то вроде этого:

try
{
  rapidxml::file<char> GpxFile (pcharfilename);
}
catch ???
{
   ???
}

Я немного погуглил, но не нашел то, что мне нужно, вместо ???.

Может ли кто-нибудь мне помочь? Спасибо!

Ответы [ 3 ]

14 голосов
/ 21 сентября 2011

Вам необходимо добавить объявление исключения рядом с оператором catch.Брошенный тип std :: runtime_error .

try
{
  rapidxml::file<char> GpxFile (pcharfilename);
}
catch (const runtime_error& error)
{
   // your error handling code here
}

Если вам нужно перехватить несколько различных типов исключений, вы можете использовать более одного оператора catch:

try
{
  rapidxml::file<char> GpxFile (pcharfilename);
}
catch (const runtime_error& error)
{
   // your error handling code here
}
catch (const std::out_of_range& another_error)
{
   // different error handling code
}
catch (...)
{
   // if an exception is thrown that is neither a runtime_error nor
   // an out_of_range, then this block will execute
}
8 голосов
/ 21 сентября 2011
try
{
    throw std::runtime_error("Hi");
}
catch(std::runtime_error& e)
{
   cout << e.what() << "\n";
}
1 голос
/ 21 сентября 2011

Ну, это зависит от того, что вы хотите сделать, когда это произойдет. Это минимум:

try
{
  rapidxml::file<char> GpxFile (pcharfilename);
}
catch (...)
{
   cout << "Got an exception!"
}

Если вы хотите получить фактическое исключение, вам нужно объявить переменную, чтобы сохранить ее в скобках вместо трех точек.

...