• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //  error_demo.cpp  --------------------------------------------------------------------//
2 
3 //  Copyright Beman Dawes 2009
4 
5 //  Distributed under the Boost Software License, Version 1.0.
6 //  See http://www.boost.org/LICENSE_1_0.txt
7 
8 //  Library home page: http://www.boost.org/libs/filesystem
9 
10 //--------------------------------------------------------------------------------------//
11 //                                                                                      //
12 //  The purpose of this program is to demonstrate how error reporting works.            //
13 //                                                                                      //
14 //--------------------------------------------------------------------------------------//
15 
16 #include <boost/filesystem.hpp>
17 #include <boost/system/system_error.hpp>
18 #include <iostream>
19 
20 using std::cout;
21 using boost::filesystem::path;
22 using boost::filesystem::filesystem_error;
23 using boost::system::error_code;
24 using boost::system::system_error;
25 namespace fs = boost::filesystem;
26 
27 namespace
28 {
report_system_error(const system_error & ex)29   void report_system_error(const system_error& ex)
30   {
31     cout << " threw system_error:\n"
32          << "    ex.code().value() is " << ex.code().value() << '\n'
33          << "    ex.code().category().name() is " << ex.code().category().name() << '\n'
34          << "    ex.what() is " << ex.what() << '\n'
35          ;
36   }
37 
report_filesystem_error(const system_error & ex)38   void report_filesystem_error(const system_error& ex)
39   {
40     cout << "  threw filesystem_error exception:\n"
41          << "    ex.code().value() is " << ex.code().value() << '\n'
42          << "    ex.code().category().name() is " << ex.code().category().name() << '\n'
43          << "    ex.what() is " << ex.what() << '\n'
44          ;
45   }
46 
report_status(fs::file_status s)47   void report_status(fs::file_status s)
48   {
49     cout << "  file_status::type() is ";
50     switch (s.type())
51     {
52     case fs::status_error:
53       cout << "status_error\n"; break;
54     case fs::file_not_found:
55       cout << "file_not_found\n"; break;
56     case fs::regular_file:
57       cout << "regular_file\n"; break;
58     case fs::directory_file:
59       cout << "directory_file\n"; break;
60     case fs::symlink_file:
61       cout << "symlink_file\n"; break;
62     case fs::block_file:
63       cout << "block_file\n"; break;
64     case fs::character_file:
65       cout << "character_file\n"; break;
66     case fs::fifo_file:
67       cout << "fifo_file\n"; break;
68     case fs::socket_file:
69       cout << "socket_file\n"; break;
70     case fs::type_unknown:
71       cout << "type_unknown\n"; break;
72     default:
73       cout << "not a valid enumeration constant\n";
74     }
75   }
76 
report_error_code(const error_code & ec)77   void report_error_code(const error_code& ec)
78   {
79     cout << "  ec:\n"
80          << "    value() is " << ec.value() << '\n'
81          << "    category().name() is " << ec.category().name() << '\n'
82          << "    message() is " <<  ec.message() << '\n'
83          ;
84   }
85 
86   bool threw_exception;
87 
88 }
89 
main(int argc,char * argv[])90 int main(int argc, char* argv[])
91 {
92   if (argc < 2)
93   {
94     cout << "Usage: error_demo path\n";
95     return 1;
96   }
97 
98   error_code ec;
99 
100   ////  construct path - no error_code
101 
102   //try { path p1(argv[1]); }
103   //catch (const system_error& ex)
104   //{
105   //  cout << "construct path without error_code";
106   //  report_system_error(ex);
107   //}
108 
109   ////  construct path - with error_code
110 
111   path p (argv[1]);
112 
113   fs::file_status s;
114   bool            b (false);
115   fs::directory_iterator di;
116 
117   //  get status - no error_code
118 
119   cout << "\nstatus(\"" << p.string() << "\");\n";
120   threw_exception = false;
121 
122   try { s = fs::status(p); }
123   catch (const system_error& ex)
124   {
125     report_filesystem_error(ex);
126     threw_exception = true;
127   }
128   if (!threw_exception)
129     cout << "  Did not throw exception\n";
130   report_status(s);
131 
132   //  get status - with error_code
133 
134   cout << "\nstatus(\"" << p.string() << "\", ec);\n";
135   s = fs::status(p, ec);
136   report_status(s);
137   report_error_code(ec);
138 
139   //  query existence - no error_code
140 
141   cout << "\nexists(\"" << p.string() << "\");\n";
142   threw_exception = false;
143 
144   try { b = fs::exists(p); }
145   catch (const system_error& ex)
146   {
147     report_filesystem_error(ex);
148     threw_exception = true;
149   }
150   if (!threw_exception)
151   {
152     cout << "  Did not throw exception\n"
153          << "  Returns: " << (b ? "true" : "false") << '\n';
154   }
155 
156   //  query existence - with error_code
157 
158   //  directory_iterator - no error_code
159 
160   cout << "\ndirectory_iterator(\"" << p.string() << "\");\n";
161   threw_exception = false;
162 
163   try { di = fs::directory_iterator(p); }
164   catch (const system_error& ex)
165   {
166     report_filesystem_error(ex);
167     threw_exception = true;
168   }
169   if (!threw_exception)
170   {
171     cout << "  Did not throw exception\n"
172       << (di == fs::directory_iterator() ? "  Equal" : "  Not equal")
173       << " to the end iterator\n";
174   }
175 
176   //  directory_iterator - with error_code
177 
178   cout << "\ndirectory_iterator(\"" << p.string() << "\", ec);\n";
179   di = fs::directory_iterator(p, ec);
180   cout << (di == fs::directory_iterator() ? "  Equal" : "  Not equal")
181        << " to the end iterator\n";
182   report_error_code(ec);
183 
184   return 0;
185 }
186