Advertisement
RobertDeMilo

WB4.13 Введение в исключения

Oct 27th, 2023
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <exception>
  3. #include <sstream>
  4. #include <string>
  5. #include <iomanip>
  6.  
  7. using namespace std;
  8.  
  9. struct Date
  10. {
  11.     int year;
  12.     int month;
  13.     int day;
  14. };
  15.  
  16. void EnsureNextSymbolAndSkip(stringstream& stream) // передаем строковый поток
  17. {
  18.     if (stream.peek() != '/')
  19.     {
  20.         stringstream ss;
  21.         // У потока есть метод peek, который позволяет посмотреть какой следующий символ идет в потоке
  22.  
  23.         ss << "expected / , but has: " << char(stream.peek());
  24.  
  25.         //throw exception();
  26.         throw runtime_error(ss.str()); // Метод str() из потока вернет строчку, которая в нем записана
  27.     }
  28.     stream.ignore(1);//Нужно пропустить следующий символ "2017/01/25"
  29.     //(передаем кол-во символов, которые хотим пропустить)
  30. }
  31.  
  32. Date ParseDate(const string& s)
  33. {
  34.     stringstream stream(s);// Объявили строковый поток, с которым дальше будем работать
  35.     Date date;
  36.  
  37.     stream >> date.year; // Считываем из потока информацию
  38.  
  39.     EnsureNextSymbolAndSkip(stream);
  40.  
  41.     stream >> date.month;
  42.  
  43.     EnsureNextSymbolAndSkip(stream);
  44.  
  45.     stream >> date.day;
  46.  
  47.     return date;
  48. }
  49.  
  50. //Для того чтобы обработать ошибки в С++ есть специальный синтаксис, который начинается с ключевого слова
  51. //try {нужно написать тот код, который потенциально может выбросить исключение}
  52. //В блоке try расположен потенциально опасный блок кода, который может выбросить исключение
  53. //
  54. //catch(exception&){обработчки ошибки}
  55. //Все исключения наследуются от класса exception
  56.  
  57.  
  58. int main()
  59. {
  60.     //string date_str = "2017/01/25";// Будем считывать дату из строки
  61.  
  62.     string date_str = "2017a01b25";// Будем считывать дату из строки
  63.  
  64.     //Опасной функцией является ParseDate
  65.     try
  66.     {
  67.         Date date = ParseDate(date_str);
  68.         cout << setw(2) << setfill('0') << date.day << '.'
  69.              << setw(2) << setfill('0') << date.month << '.'
  70.              << setw(2) << setfill('0') << date.year << endl;
  71.     }
  72.     catch (exception& ex)
  73.     {
  74.         cout << "exeption: " << ex.what();
  75.     }
  76.  
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement