gravatar
deba@inf.elte.hu
deba@inf.elte.hu
Simplifying exceptions - Using asserts instead of exceptions for unitialized parameters - Only the IO exceptions are used in the lemon - DataFormatError is renamed to FormatError - The IoError is used for file access errors
0 11 0
default
11 files changed with 380 insertions and 511 deletions:
↑ Collapse diff ↑
Ignore white space 6 line context
... ...
@@ -46,13 +46,13 @@
46 46
  try {
47 47
    digraphReader("digraph.lgf", g). // read the directed graph into g
48 48
      arcMap("capacity", cap).       // read the 'capacity' arc map into cap
49 49
      node("source", s).             // read 'source' node to s
50 50
      node("target", t).             // read 'target' node to t
51 51
      run();
52
  } catch (DataFormatError& error) { // check if there was any error
52
  } catch (Exception& error) { // check if there was any error
53 53
    std::cerr << "Error: " << error.what() << std::endl;
54 54
    return -1;
55 55
  }
56 56

	
57 57
  std::cout << "A digraph is read from 'digraph.lgf'." << std::endl;
58 58
  std::cout << "Number of nodes: " << countNodes(g) << std::endl;
Ignore white space 6 line context
... ...
@@ -307,14 +307,15 @@
307 307

	
308 308

	
309 309
    ///Magic type for operator[]
310 310

	
311 311
    ///This is the type of the return value of ArgParser::operator[]().
312 312
    ///It automatically converts to \c int, \c double, \c bool or
313
    ///\c std::string if the type of the option matches, otherwise it
314
    ///throws an exception (i.e. it performs runtime type checking).
313
    ///\c std::string if the type of the option matches, which is checked
314
    ///with an \ref LEMON_ASSERT "assertion" (i.e. it performs runtime
315
    ///type checking).
315 316
    class RefType
316 317
    {
317 318
      const ArgParser &_parser;
318 319
      std::string _name;
319 320
    public:
320 321
      ///\e
Ignore white space 6 line context
... ...
@@ -105,13 +105,13 @@
105 105
#ifdef DOXYGEN
106 106

	
107 107
/// \ingroup exceptions
108 108
///
109 109
/// \brief Macro for assertion with customizable message
110 110
///
111
/// Macro for assertion with customizable message.  
111
/// Macro for assertion with customizable message.
112 112
/// \param exp An expression that must be convertible to \c bool.  If it is \c
113 113
/// false, then an assertion is raised. The concrete behaviour depends on the
114 114
/// settings of the assertion system.
115 115
/// \param msg A <tt>const char*</tt> parameter, which can be used to provide
116 116
/// information about the circumstances of the failed assertion.
117 117
///
Ignore white space 6 line context
... ...
@@ -132,22 +132,12 @@
132 132
#else
133 133
  template <typename GR=ListDigraph,
134 134
            typename TR=BfsDefaultTraits<GR> >
135 135
#endif
136 136
  class Bfs {
137 137
  public:
138
    ///\ref Exception for uninitialized parameters.
139

	
140
    ///This error represents problems in the initialization of the
141
    ///parameters of the algorithm.
142
    class UninitializedParameter : public lemon::UninitializedParameter {
143
    public:
144
      virtual const char* what() const throw() {
145
        return "lemon::Bfs::UninitializedParameter";
146
      }
147
    };
148 138

	
149 139
    ///The type of the digraph the algorithm runs on.
150 140
    typedef typename TR::Digraph Digraph;
151 141

	
152 142
    ///\brief The type of the map that stores the predecessor arcs of the
153 143
    ///shortest paths.
... ...
@@ -229,13 +219,14 @@
229 219

	
230 220
    template <class T>
231 221
    struct SetPredMapTraits : public Traits {
232 222
      typedef T PredMap;
233 223
      static PredMap *createPredMap(const Digraph &)
234 224
      {
235
        throw UninitializedParameter();
225
        LEMON_ASSERT(false, "PredMap is not initialized");
226
        return 0; // ignore warnings
236 227
      }
237 228
    };
238 229
    ///\brief \ref named-templ-param "Named parameter" for setting
239 230
    ///\ref PredMap type.
240 231
    ///
241 232
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -247,13 +238,14 @@
247 238

	
248 239
    template <class T>
249 240
    struct SetDistMapTraits : public Traits {
250 241
      typedef T DistMap;
251 242
      static DistMap *createDistMap(const Digraph &)
252 243
      {
253
        throw UninitializedParameter();
244
        LEMON_ASSERT(false, "DistMap is not initialized");
245
        return 0; // ignore warnings
254 246
      }
255 247
    };
256 248
    ///\brief \ref named-templ-param "Named parameter" for setting
257 249
    ///\ref DistMap type.
258 250
    ///
259 251
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -265,13 +257,14 @@
265 257

	
266 258
    template <class T>
267 259
    struct SetReachedMapTraits : public Traits {
268 260
      typedef T ReachedMap;
269 261
      static ReachedMap *createReachedMap(const Digraph &)
270 262
      {
271
        throw UninitializedParameter();
263
        LEMON_ASSERT(false, "ReachedMap is not initialized");
264
        return 0; // ignore warnings
272 265
      }
273 266
    };
274 267
    ///\brief \ref named-templ-param "Named parameter" for setting
275 268
    ///\ref ReachedMap type.
276 269
    ///
277 270
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -283,13 +276,14 @@
283 276

	
284 277
    template <class T>
285 278
    struct SetProcessedMapTraits : public Traits {
286 279
      typedef T ProcessedMap;
287 280
      static ProcessedMap *createProcessedMap(const Digraph &)
288 281
      {
289
        throw UninitializedParameter();
282
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
283
        return 0; // ignore warnings
290 284
      }
291 285
    };
292 286
    ///\brief \ref named-templ-param "Named parameter" for setting
293 287
    ///\ref ProcessedMap type.
294 288
    ///
295 289
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -301,12 +295,13 @@
301 295

	
302 296
    struct SetStandardProcessedMapTraits : public Traits {
303 297
      typedef typename Digraph::template NodeMap<bool> ProcessedMap;
304 298
      static ProcessedMap *createProcessedMap(const Digraph &g)
305 299
      {
306 300
        return new ProcessedMap(g);
301
        return 0; // ignore warnings
307 302
      }
308 303
    };
309 304
    ///\brief \ref named-templ-param "Named parameter" for setting
310 305
    ///\ref ProcessedMap type to be <tt>Digraph::NodeMap<bool></tt>.
311 306
    ///
312 307
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -1037,13 +1032,12 @@
1037 1032
    ///in order to compute the shortest path to node \c t
1038 1033
    ///(it stops searching when \c t is processed).
1039 1034
    ///
1040 1035
    ///\return \c true if \c t is reachable form \c s.
1041 1036
    bool run(Node s, Node t)
1042 1037
    {
1043
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
1044 1038
      Bfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
1045 1039
      if (Base::_pred)
1046 1040
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1047 1041
      if (Base::_dist)
1048 1042
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
1049 1043
      if (Base::_reached)
... ...
@@ -1320,24 +1314,12 @@
1320 1314
            typename _Visitor = BfsVisitor<_Digraph>,
1321 1315
            typename _Traits = BfsDefaultTraits<_Digraph> >
1322 1316
#endif
1323 1317
  class BfsVisit {
1324 1318
  public:
1325 1319

	
1326
    /// \brief \ref Exception for uninitialized parameters.
1327
    ///
1328
    /// This error represents problems in the initialization
1329
    /// of the parameters of the algorithm.
1330
    class UninitializedParameter : public lemon::UninitializedParameter {
1331
    public:
1332
      virtual const char* what() const throw()
1333
      {
1334
        return "lemon::BfsVisit::UninitializedParameter";
1335
      }
1336
    };
1337

	
1338 1320
    ///The traits class.
1339 1321
    typedef _Traits Traits;
1340 1322

	
1341 1323
    ///The type of the digraph the algorithm runs on.
1342 1324
    typedef typename Traits::Digraph Digraph;
1343 1325

	
... ...
@@ -1386,13 +1368,14 @@
1386 1368

	
1387 1369
    ///@{
1388 1370
    template <class T>
1389 1371
    struct SetReachedMapTraits : public Traits {
1390 1372
      typedef T ReachedMap;
1391 1373
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1392
        throw UninitializedParameter();
1374
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1375
        return 0; // ignore warnings
1393 1376
      }
1394 1377
    };
1395 1378
    /// \brief \ref named-templ-param "Named parameter" for setting
1396 1379
    /// ReachedMap type.
1397 1380
    ///
1398 1381
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
Ignore white space 12 line context
... ...
@@ -126,13 +126,12 @@
126 126
      /// not stored in the heap.
127 127
      ///
128 128
      /// This method sets the priority of the given item if it is
129 129
      /// already stored in the heap.
130 130
      /// Otherwise it inserts the given item with the given priority.
131 131
      ///
132
      /// It may throw an \ref UnderflowPriorityException.
133 132
      /// \param i The item.
134 133
      /// \param p The priority.
135 134
      void set(const Item &i, const Prio &p) {}
136 135

	
137 136
      /// \brief Decreases the priority of an item to the given value.
138 137
      ///
Ignore white space 6 line context
... ...
@@ -133,22 +133,12 @@
133 133
#else
134 134
  template <typename GR=ListDigraph,
135 135
            typename TR=DfsDefaultTraits<GR> >
136 136
#endif
137 137
  class Dfs {
138 138
  public:
139
    ///\ref Exception for uninitialized parameters.
140

	
141
    ///This error represents problems in the initialization of the
142
    ///parameters of the algorithm.
143
    class UninitializedParameter : public lemon::UninitializedParameter {
144
    public:
145
      virtual const char* what() const throw() {
146
        return "lemon::Dfs::UninitializedParameter";
147
      }
148
    };
149 139

	
150 140
    ///The type of the digraph the algorithm runs on.
151 141
    typedef typename TR::Digraph Digraph;
152 142

	
153 143
    ///\brief The type of the map that stores the predecessor arcs of the
154 144
    ///DFS paths.
... ...
@@ -229,13 +219,14 @@
229 219

	
230 220
    template <class T>
231 221
    struct SetPredMapTraits : public Traits {
232 222
      typedef T PredMap;
233 223
      static PredMap *createPredMap(const Digraph &)
234 224
      {
235
        throw UninitializedParameter();
225
        LEMON_ASSERT(false, "PredMap is not initialized");
226
        return 0; // ignore warnings
236 227
      }
237 228
    };
238 229
    ///\brief \ref named-templ-param "Named parameter" for setting
239 230
    ///\ref PredMap type.
240 231
    ///
241 232
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -247,13 +238,14 @@
247 238

	
248 239
    template <class T>
249 240
    struct SetDistMapTraits : public Traits {
250 241
      typedef T DistMap;
251 242
      static DistMap *createDistMap(const Digraph &)
252 243
      {
253
        throw UninitializedParameter();
244
        LEMON_ASSERT(false, "DistMap is not initialized");
245
        return 0; // ignore warnings
254 246
      }
255 247
    };
256 248
    ///\brief \ref named-templ-param "Named parameter" for setting
257 249
    ///\ref DistMap type.
258 250
    ///
259 251
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -265,13 +257,14 @@
265 257

	
266 258
    template <class T>
267 259
    struct SetReachedMapTraits : public Traits {
268 260
      typedef T ReachedMap;
269 261
      static ReachedMap *createReachedMap(const Digraph &)
270 262
      {
271
        throw UninitializedParameter();
263
        LEMON_ASSERT(false, "ReachedMap is not initialized");
264
        return 0; // ignore warnings
272 265
      }
273 266
    };
274 267
    ///\brief \ref named-templ-param "Named parameter" for setting
275 268
    ///\ref ReachedMap type.
276 269
    ///
277 270
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -283,13 +276,14 @@
283 276

	
284 277
    template <class T>
285 278
    struct SetProcessedMapTraits : public Traits {
286 279
      typedef T ProcessedMap;
287 280
      static ProcessedMap *createProcessedMap(const Digraph &)
288 281
      {
289
        throw UninitializedParameter();
282
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
283
        return 0; // ignore warnings
290 284
      }
291 285
    };
292 286
    ///\brief \ref named-templ-param "Named parameter" for setting
293 287
    ///\ref ProcessedMap type.
294 288
    ///
295 289
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -971,13 +965,12 @@
971 965
    ///in order to compute the DFS path to node \c t
972 966
    ///(it stops searching when \c t is processed).
973 967
    ///
974 968
    ///\return \c true if \c t is reachable form \c s.
975 969
    bool run(Node s, Node t)
976 970
    {
977
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
978 971
      Dfs<Digraph,TR> alg(*reinterpret_cast<const Digraph*>(Base::_g));
979 972
      if (Base::_pred)
980 973
        alg.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
981 974
      if (Base::_dist)
982 975
        alg.distMap(*reinterpret_cast<DistMap*>(Base::_dist));
983 976
      if (Base::_reached)
... ...
@@ -1267,24 +1260,12 @@
1267 1260
            typename _Visitor = DfsVisitor<_Digraph>,
1268 1261
            typename _Traits = DfsDefaultTraits<_Digraph> >
1269 1262
#endif
1270 1263
  class DfsVisit {
1271 1264
  public:
1272 1265

	
1273
    /// \brief \ref Exception for uninitialized parameters.
1274
    ///
1275
    /// This error represents problems in the initialization
1276
    /// of the parameters of the algorithm.
1277
    class UninitializedParameter : public lemon::UninitializedParameter {
1278
    public:
1279
      virtual const char* what() const throw()
1280
      {
1281
        return "lemon::DfsVisit::UninitializedParameter";
1282
      }
1283
    };
1284

	
1285 1266
    ///The traits class.
1286 1267
    typedef _Traits Traits;
1287 1268

	
1288 1269
    ///The type of the digraph the algorithm runs on.
1289 1270
    typedef typename Traits::Digraph Digraph;
1290 1271

	
... ...
@@ -1333,13 +1314,14 @@
1333 1314

	
1334 1315
    ///@{
1335 1316
    template <class T>
1336 1317
    struct SetReachedMapTraits : public Traits {
1337 1318
      typedef T ReachedMap;
1338 1319
      static ReachedMap *createReachedMap(const Digraph &digraph) {
1339
        throw UninitializedParameter();
1320
        LEMON_ASSERT(false, "ReachedMap is not initialized");
1321
        return 0; // ignore warnings
1340 1322
      }
1341 1323
    };
1342 1324
    /// \brief \ref named-templ-param "Named parameter" for setting
1343 1325
    /// ReachedMap type.
1344 1326
    ///
1345 1327
    /// \ref named-templ-param "Named parameter" for setting ReachedMap type.
Ignore white space 6 line context
... ...
@@ -222,22 +222,12 @@
222 222
  template <typename GR=ListDigraph,
223 223
            typename LM=typename GR::template ArcMap<int>,
224 224
            typename TR=DijkstraDefaultTraits<GR,LM> >
225 225
#endif
226 226
  class Dijkstra {
227 227
  public:
228
    ///\ref Exception for uninitialized parameters.
229

	
230
    ///This error represents problems in the initialization of the
231
    ///parameters of the algorithm.
232
    class UninitializedParameter : public lemon::UninitializedParameter {
233
    public:
234
      virtual const char* what() const throw() {
235
        return "lemon::Dijkstra::UninitializedParameter";
236
      }
237
    };
238 228

	
239 229
    ///The type of the digraph the algorithm runs on.
240 230
    typedef typename TR::Digraph Digraph;
241 231

	
242 232
    ///The type of the length of the arcs.
243 233
    typedef typename TR::LengthMap::Value Value;
... ...
@@ -329,13 +319,14 @@
329 319

	
330 320
    template <class T>
331 321
    struct SetPredMapTraits : public Traits {
332 322
      typedef T PredMap;
333 323
      static PredMap *createPredMap(const Digraph &)
334 324
      {
335
        throw UninitializedParameter();
325
        LEMON_ASSERT(false, "PredMap is not initialized");
326
        return 0; // ignore warnings
336 327
      }
337 328
    };
338 329
    ///\brief \ref named-templ-param "Named parameter" for setting
339 330
    ///\ref PredMap type.
340 331
    ///
341 332
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -348,13 +339,14 @@
348 339

	
349 340
    template <class T>
350 341
    struct SetDistMapTraits : public Traits {
351 342
      typedef T DistMap;
352 343
      static DistMap *createDistMap(const Digraph &)
353 344
      {
354
        throw UninitializedParameter();
345
        LEMON_ASSERT(false, "DistMap is not initialized");
346
        return 0; // ignore warnings
355 347
      }
356 348
    };
357 349
    ///\brief \ref named-templ-param "Named parameter" for setting
358 350
    ///\ref DistMap type.
359 351
    ///
360 352
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -367,13 +359,14 @@
367 359

	
368 360
    template <class T>
369 361
    struct SetProcessedMapTraits : public Traits {
370 362
      typedef T ProcessedMap;
371 363
      static ProcessedMap *createProcessedMap(const Digraph &)
372 364
      {
373
        throw UninitializedParameter();
365
        LEMON_ASSERT(false, "ProcessedMap is not initialized");
366
        return 0; // ignore warnings
374 367
      }
375 368
    };
376 369
    ///\brief \ref named-templ-param "Named parameter" for setting
377 370
    ///\ref ProcessedMap type.
378 371
    ///
379 372
    ///\ref named-templ-param "Named parameter" for setting
... ...
@@ -405,17 +398,19 @@
405 398

	
406 399
    template <class H, class CR>
407 400
    struct SetHeapTraits : public Traits {
408 401
      typedef CR HeapCrossRef;
409 402
      typedef H Heap;
410 403
      static HeapCrossRef *createHeapCrossRef(const Digraph &) {
411
        throw UninitializedParameter();
404
        LEMON_ASSERT(false, "HeapCrossRef is not initialized");
405
        return 0; // ignore warnings
412 406
      }
413 407
      static Heap *createHeap(HeapCrossRef &)
414 408
      {
415
        throw UninitializedParameter();
409
        LEMON_ASSERT(false, "Heap is not initialized");
410
        return 0; // ignore warnings
416 411
      }
417 412
    };
418 413
    ///\brief \ref named-templ-param "Named parameter" for setting
419 414
    ///heap and cross reference type
420 415
    ///
421 416
    ///\ref named-templ-param "Named parameter" for setting heap and cross
... ...
@@ -1155,13 +1150,12 @@
1155 1150
    ///Runs Dijkstra algorithm from the given source node.
1156 1151

	
1157 1152
    ///This method runs %Dijkstra algorithm from the given source node
1158 1153
    ///in order to compute the shortest path to each node.
1159 1154
    void run(Node s)
1160 1155
    {
1161
      if (s==INVALID) throw UninitializedParameter();
1162 1156
      Dijkstra<Digraph,LengthMap,TR>
1163 1157
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1164 1158
             *reinterpret_cast<const LengthMap*>(Base::_length));
1165 1159
      if (Base::_pred)
1166 1160
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1167 1161
      if (Base::_dist)
... ...
@@ -1177,13 +1171,12 @@
1177 1171
    ///in order to compute the shortest path to node \c t
1178 1172
    ///(it stops searching when \c t is processed).
1179 1173
    ///
1180 1174
    ///\return \c true if \c t is reachable form \c s.
1181 1175
    bool run(Node s, Node t)
1182 1176
    {
1183
      if (s==INVALID || t==INVALID) throw UninitializedParameter();
1184 1177
      Dijkstra<Digraph,LengthMap,TR>
1185 1178
        dijk(*reinterpret_cast<const Digraph*>(Base::_g),
1186 1179
             *reinterpret_cast<const LengthMap*>(Base::_length));
1187 1180
      if (Base::_pred)
1188 1181
        dijk.predMap(*reinterpret_cast<PredMap*>(Base::_pred));
1189 1182
      if (Base::_dist)
Ignore white space 6 line context
... ...
@@ -32,386 +32,244 @@
32 32

	
33 33
namespace lemon {
34 34

	
35 35
  /// \addtogroup exceptions
36 36
  /// @{
37 37

	
38
  /// \brief Exception safe wrapper class.
38
  /// \brief Generic exception class.
39 39
  ///
40
  /// Exception safe wrapper class to implement the members of exceptions.
41
  template <typename _Type>
42
  class ExceptionMember {
43
  public:
44
    typedef _Type Type;
45

	
46
    ExceptionMember() throw() {
47
      try {
48
        ptr.reset(new Type());
49
      } catch (...) {}
50
    }
51

	
52
    ExceptionMember(const Type& type) throw() {
53
      try {
54
        ptr.reset(new Type());
55
        if (ptr.get() == 0) return;
56
        *ptr = type;
57
      } catch (...) {}
58
    }
59

	
60
    ExceptionMember(const ExceptionMember& copy) throw() {
61
      try {
62
        if (!copy.valid()) return;
63
        ptr.reset(new Type());
64
        if (ptr.get() == 0) return;
65
        *ptr = copy.get();
66
      } catch (...) {}
67
    }
68

	
69
    ExceptionMember& operator=(const ExceptionMember& copy) throw() {
70
      if (ptr.get() == 0) return;
71
      try {
72
        if (!copy.valid()) return;
73
        *ptr = copy.get();
74
      } catch (...) {}
75
    }
76

	
77
    void set(const Type& type) throw() {
78
      if (ptr.get() == 0) return;
79
      try {
80
        *ptr = type;
81
      } catch (...) {}
82
    }
83

	
84
    const Type& get() const {
85
      return *ptr;
86
    }
87

	
88
    bool valid() const throw() {
89
      return ptr.get() != 0;
90
    }
91

	
92
  private:
93
    std::auto_ptr<_Type> ptr;
94
  };
95

	
96
  /// Exception-safe convenient error message builder class.
97

	
98
  /// Helper class which provides a convenient ostream-like (operator <<
99
  /// based) interface to create a string message. Mostly useful in
100
  /// exception classes (therefore the name).
101
  class ErrorMessage {
102
  protected:
103
    ///\e
104

	
105
    mutable std::auto_ptr<std::ostringstream> buf;
106

	
107
    ///\e
108
    bool init() throw() {
109
      try {
110
        buf.reset(new std::ostringstream);
111
      }
112
      catch(...) {
113
        buf.reset();
114
      }
115
      return buf.get();
116
    }
117

	
118
  public:
119

	
120
    ///\e
121
    ErrorMessage() throw() { init(); }
122

	
123
    ErrorMessage(const ErrorMessage& em) throw() : buf(em.buf) { }
124

	
125
    ///\e
126
    ErrorMessage(const char *msg) throw() {
127
      init();
128
      *this << msg;
129
    }
130

	
131
    ///\e
132
    ErrorMessage(const std::string &msg) throw() {
133
      init();
134
      *this << msg;
135
    }
136

	
137
    ///\e
138
    template <typename T>
139
    ErrorMessage& operator<<(const T &t) throw() {
140
      if( ! buf.get() ) return *this;
141

	
142
      try {
143
        *buf << t;
144
      }
145
      catch(...) {
146
        buf.reset();
147
      }
148
      return *this;
149
    }
150

	
151
    ///\e
152
    const char* message() throw() {
153
      if( ! buf.get() ) return 0;
154

	
155
      const char* mes = 0;
156
      try {
157
        mes = buf->str().c_str();
158
      }
159
      catch(...) {}
160
      return mes;
161
    }
162

	
163
  };
164

	
165
  /// Generic exception class.
166

	
167 40
  /// Base class for exceptions used in LEMON.
168 41
  ///
169 42
  class Exception : public std::exception {
170 43
  public:
171
    ///\e
44
    ///\e Constructor
172 45
    Exception() {}
173
    ///\e
46
    ///\e Virtual destructor
174 47
    virtual ~Exception() throw() {}
175
    ///\e
48
    ///\e A short description of the exception
176 49
    virtual const char* what() const throw() {
177 50
      return "lemon::Exception";
178 51
    }
179 52
  };
180 53

	
181
  /// One of the two main subclasses of \ref Exception.
54
  /// \brief Input-Output error
55
  ///
56
  /// This exception is thrown when a file operation cannot be
57
  /// succeeded.
58
  class IoError : public Exception {
59
  protected:
60
    std::string _message;
61
    std::string _file;
182 62

	
183
  /// Logic errors represent problems in the internal logic of a program;
184
  /// in theory, these are preventable, and even detectable before the
185
  /// program runs (e.g. violations of class invariants).
186
  ///
187
  /// A typical example for this is \ref UninitializedParameter.
188
  class LogicError : public Exception {
63
    mutable std::string _what;
189 64
  public:
65

	
66
    /// Copy constructor
67
    IoError(const IoError &error) {
68
      message(error._message);
69
      file(error._file);
70
    }
71

	
72
    /// Constructor
73
    explicit IoError(const char *message) {
74
      IoError::message(message);
75
    }
76

	
77
    /// Constructor
78
    explicit IoError(const std::string &message) {
79
      IoError::message(message);
80
    }
81

	
82
    /// Constructor
83
    IoError(const std::string &file, const char *message) {
84
      IoError::message(message);
85
      IoError::file(file);
86
    }
87

	
88
    /// Constructor
89
    IoError(const std::string &file, const std::string &message) {
90
      IoError::message(message);
91
      IoError::file(file);
92
    }
93

	
94
    /// Virtual destructor
95
    virtual ~IoError() throw() {}
96

	
97
    /// Set the error message
98
    void message(const char *message) {
99
      try {
100
        _message = message;
101
      } catch (...) {}
102
    }
103

	
104
    /// Set the error message
105
    void message(const std::string& message) {
106
      try {
107
        _message = message;
108
      } catch (...) {}
109
    }
110

	
111
    /// Set the file name
112
    void file(const std::string &file) {
113
      try {
114
        _file = file;
115
      } catch (...) {}
116
    }
117

	
118
    /// Returns the error message
119
    const std::string& message() const {
120
      return _message;
121
    }
122

	
123
    /// \brief Returns the filename
124
    ///
125
    /// Returns the filename or empty string if the filename was not
126
    /// specified.
127
    const std::string& file() const {
128
      return _file;
129
    }
130

	
131
    /// \brief Returns a short error message
132
    ///
133
    /// Returns a short error message which contains the message, the
134
    /// file name and the line number.
190 135
    virtual const char* what() const throw() {
191
      return "lemon::LogicError";
136
      try {
137
        _what.clear();
138
        std::ostringstream oss;
139
        oss << "lemon:IoError" << ": ";
140
        oss << message();
141
        if (!file().empty()) {
142
          oss << " (";
143
          if (!file().empty()) oss << "with file '" << file() << "'";
144
          oss << ")";
145
        }
146
        _what = oss.str();
147
      }
148
      catch (...) {}
149
      if (!_what.empty()) return _what.c_str();
150
      else return "lemon:IoError";
192 151
    }
152

	
193 153
  };
194 154

	
195
  /// \ref Exception for uninitialized parameters.
196

	
197
  /// This error represents problems in the initialization
198
  /// of the parameters of the algorithms.
199
  class UninitializedParameter : public LogicError {
200
  public:
201
    virtual const char* what() const throw() {
202
      return "lemon::UninitializedParameter";
203
    }
204
  };
205

	
206

	
207
  /// One of the two main subclasses of \ref Exception.
208

	
209
  /// Runtime errors represent problems outside the scope of a program;
210
  /// they cannot be easily predicted and can generally only be caught
211
  /// as the program executes.
212
  class RuntimeError : public Exception {
213
  public:
214
    virtual const char* what() const throw() {
215
      return "lemon::RuntimeError";
216
    }
217
  };
218

	
219
  ///\e
220
  class RangeError : public RuntimeError {
221
  public:
222
    virtual const char* what() const throw() {
223
      return "lemon::RangeError";
224
    }
225
  };
226

	
227
  ///\e
228
  class IoError : public RuntimeError {
229
  public:
230
    virtual const char* what() const throw() {
231
      return "lemon::IoError";
232
    }
233
  };
234

	
235
  ///\e
236
  class DataFormatError : public IoError {
155
  /// \brief Format error
156
  ///
157
  /// This class is used to indicate if an input file has wrong
158
  /// formatting, or a data representation is not legal.
159
  class FormatError : public Exception {
237 160
  protected:
238
    ExceptionMember<std::string> _message;
239
    ExceptionMember<std::string> _file;
161
    std::string _message;
162
    std::string _file;
240 163
    int _line;
241 164

	
242
    mutable ExceptionMember<std::string> _message_holder;
165
    mutable std::string _what;
243 166
  public:
244 167

	
245
    DataFormatError(const DataFormatError &dfe) :
246
      IoError(dfe), _message(dfe._message), _file(dfe._file),
247
      _line(dfe._line) {}
248

	
249
    ///\e
250
    explicit DataFormatError(const char *the_message)
251
      : _message(the_message), _line(0) {}
252

	
253
    ///\e
254
    DataFormatError(const std::string &file_name, int line_num,
255
                    const char *the_message)
256
      : _message(the_message), _line(line_num) { file(file_name); }
257

	
258
    ///\e
259
    void line(int ln) { _line = ln; }
260
    ///\e
261
    void message(const std::string& msg) { _message.set(msg); }
262
    ///\e
263
    void file(const std::string &fl) { _file.set(fl); }
264

	
265
    ///\e
266
    int line() const { return _line; }
267
    ///\e
268
    const char* message() const {
269
      if (_message.valid() && !_message.get().empty()) {
270
        return _message.get().c_str();
271
      } else {
272
        return 0;
273
      }
168
    /// Copy constructor
169
    FormatError(const FormatError &error) {
170
      message(error._message);
171
      file(error._file);
172
      line(error._line);
274 173
    }
275 174

	
276
    /// \brief Returns the filename.
277
    ///
278
    /// Returns \e null if the filename was not specified.
279
    const char* file() const {
280
      if (_file.valid() && !_file.get().empty()) {
281
        return _file.get().c_str();
282
      } else {
283
        return 0;
284
      }
175
    /// Constructor
176
    explicit FormatError(const char *message) {
177
      FormatError::message(message);
178
      _line = 0;
285 179
    }
286 180

	
287
    ///\e
181
    /// Constructor
182
    explicit FormatError(const std::string &message) {
183
      FormatError::message(message);
184
      _line = 0;
185
    }
186

	
187
    /// Constructor
188
    FormatError(const std::string &file, int line, const char *message) {
189
      FormatError::message(message);
190
      FormatError::file(file);
191
      FormatError::line(line);
192
    }
193

	
194
    /// Constructor
195
    FormatError(const std::string &file, int line, const std::string &message) {
196
      FormatError::message(message);
197
      FormatError::file(file);
198
      FormatError::line(line);
199
    }
200

	
201
    /// Virtual destructor
202
    virtual ~FormatError() throw() {}
203

	
204
    /// Set the line number
205
    void line(int line) { _line = line; }
206

	
207
    /// Set the error message
208
    void message(const char *message) {
209
      try {
210
        _message = message;
211
      } catch (...) {}
212
    }
213

	
214
    /// Set the error message
215
    void message(const std::string& message) {
216
      try {
217
        _message = message;
218
      } catch (...) {}
219
    }
220

	
221
    /// Set the file name
222
    void file(const std::string &file) {
223
      try {
224
        _file = file;
225
      } catch (...) {}
226
    }
227

	
228
    /// \brief Returns the line number
229
    ///
230
    /// Returns the line number or zero if it was not specified.
231
    int line() const { return _line; }
232

	
233
    /// Returns the error message
234
    const std::string& message() const {
235
      return _message;
236
    }
237

	
238
    /// \brief Returns the filename
239
    ///
240
    /// Returns the filename or empty string if the filename was not
241
    /// specified.
242
    const std::string& file() const {
243
      return _file;
244
    }
245

	
246
    /// \brief Returns a short error message
247
    ///
248
    /// Returns a short error message which contains the message, the
249
    /// file name and the line number.
288 250
    virtual const char* what() const throw() {
289 251
      try {
290
        std::ostringstream ostr;
291
        ostr << "lemon:DataFormatError" << ": ";
292
        if (message()) ostr << message();
293
        if( file() || line() != 0 ) {
294
          ostr << " (";
295
          if( file() ) ostr << "in file '" << file() << "'";
296
          if( file() && line() != 0 ) ostr << " ";
297
          if( line() != 0 ) ostr << "at line " << line();
298
          ostr << ")";
252
        _what.clear();
253
        std::ostringstream oss;
254
        oss << "lemon:FormatError" << ": ";
255
        oss << message();
256
        if (!file().empty() || line() != 0) {
257
          oss << " (";
258
          if (!file().empty()) oss << "in file '" << file() << "'";
259
          if (!file().empty() && line() != 0) oss << " ";
260
          if (line() != 0) oss << "at line " << line();
261
          oss << ")";
299 262
        }
300
        _message_holder.set(ostr.str());
263
        _what = oss.str();
301 264
      }
302 265
      catch (...) {}
303
      if( _message_holder.valid()) return _message_holder.get().c_str();
304
      return "lemon:DataFormatError";
266
      if (!_what.empty()) return _what.c_str();
267
      else return "lemon:FormatError";
305 268
    }
306 269

	
307
    virtual ~DataFormatError() throw() {}
308
  };
309

	
310
  ///\e
311
  class FileOpenError : public IoError {
312
  protected:
313
    ExceptionMember<std::string> _file;
314

	
315
    mutable ExceptionMember<std::string> _message_holder;
316
  public:
317

	
318
    FileOpenError(const FileOpenError &foe) :
319
      IoError(foe), _file(foe._file) {}
320

	
321
    ///\e
322
    explicit FileOpenError(const std::string& fl)
323
      : _file(fl) {}
324

	
325

	
326
    ///\e
327
    void file(const std::string &fl) { _file.set(fl); }
328

	
329
    /// \brief Returns the filename.
330
    ///
331
    /// Returns \e null if the filename was not specified.
332
    const char* file() const {
333
      if (_file.valid() && !_file.get().empty()) {
334
        return _file.get().c_str();
335
      } else {
336
        return 0;
337
      }
338
    }
339

	
340
    ///\e
341
    virtual const char* what() const throw() {
342
      try {
343
        std::ostringstream ostr;
344
        ostr << "lemon::FileOpenError" << ": ";
345
        ostr << "Cannot open file - " << file();
346
        _message_holder.set(ostr.str());
347
      }
348
      catch (...) {}
349
      if( _message_holder.valid()) return _message_holder.get().c_str();
350
      return "lemon::FileOpenError";
351
    }
352
    virtual ~FileOpenError() throw() {}
353
  };
354

	
355
  class IoParameterError : public IoError {
356
  protected:
357
    ExceptionMember<std::string> _message;
358
    ExceptionMember<std::string> _file;
359

	
360
    mutable ExceptionMember<std::string> _message_holder;
361
  public:
362

	
363
    IoParameterError(const IoParameterError &ile) :
364
      IoError(ile), _message(ile._message), _file(ile._file) {}
365

	
366
    ///\e
367
    explicit IoParameterError(const char *the_message)
368
      : _message(the_message) {}
369

	
370
    ///\e
371
    IoParameterError(const char *file_name, const char *the_message)
372
      : _message(the_message), _file(file_name) {}
373

	
374
     ///\e
375
    void message(const std::string& msg) { _message.set(msg); }
376
    ///\e
377
    void file(const std::string &fl) { _file.set(fl); }
378

	
379
     ///\e
380
    const char* message() const {
381
      if (_message.valid()) {
382
        return _message.get().c_str();
383
      } else {
384
        return 0;
385
      }
386
    }
387

	
388
    /// \brief Returns the filename.
389
    ///
390
    /// Returns \c 0 if the filename was not specified.
391
    const char* file() const {
392
      if (_file.valid()) {
393
        return _file.get().c_str();
394
      } else {
395
        return 0;
396
      }
397
    }
398

	
399
    ///\e
400
    virtual const char* what() const throw() {
401
      try {
402
        std::ostringstream ostr;
403
        if (message()) ostr << message();
404
        if (file()) ostr << "(when reading file '" << file() << "')";
405
        _message_holder.set(ostr.str());
406
      }
407
      catch (...) {}
408
      if( _message_holder.valid() ) return _message_holder.get().c_str();
409
      return "lemon:IoParameterError";
410
    }
411
    virtual ~IoParameterError() throw() {}
412 270
  };
413 271

	
414 272
  /// @}
415 273

	
416 274
}
417 275

	
Ignore white space 6 line context
... ...
@@ -37,12 +37,13 @@
37 37
#include<lemon/math.h>
38 38
#include<lemon/core.h>
39 39
#include<lemon/dim2.h>
40 40
#include<lemon/maps.h>
41 41
#include<lemon/color.h>
42 42
#include<lemon/bits/bezier.h>
43
#include<lemon/error.h>
43 44

	
44 45

	
45 46
///\ingroup eps_io
46 47
///\file
47 48
///\brief A well configurable tool for visualizing graphs
48 49

	
... ...
@@ -1163,14 +1164,19 @@
1163 1164
///instead of a stream.
1164 1165
///\sa graphToEps(G &g, std::ostream& os)
1165 1166
template<class G>
1166 1167
GraphToEps<DefaultGraphToEpsTraits<G> >
1167 1168
graphToEps(G &g,const char *file_name)
1168 1169
{
1170
  std::ostream* os = new std::ofstream(file_name);
1171
  if (!(*os)) {
1172
    delete os;
1173
    throw IoError(file_name, "Cannot write file");
1174
  }
1169 1175
  return GraphToEps<DefaultGraphToEpsTraits<G> >
1170
    (DefaultGraphToEpsTraits<G>(g,*new std::ofstream(file_name),true));
1176
    (DefaultGraphToEpsTraits<G>(g,*os,true));
1171 1177
}
1172 1178

	
1173 1179
///Generates an EPS file from a graph
1174 1180

	
1175 1181
///\ingroup eps_io
1176 1182
///This function does the same as
... ...
@@ -1179,13 +1185,18 @@
1179 1185
///instead of a stream.
1180 1186
///\sa graphToEps(G &g, std::ostream& os)
1181 1187
template<class G>
1182 1188
GraphToEps<DefaultGraphToEpsTraits<G> >
1183 1189
graphToEps(G &g,const std::string& file_name)
1184 1190
{
1191
  std::ostream* os = new std::ofstream(file_name.c_str());
1192
  if (!(*os)) {
1193
    delete os;
1194
    throw IoError(file_name, "Cannot write file");
1195
  }
1185 1196
  return GraphToEps<DefaultGraphToEpsTraits<G> >
1186
    (DefaultGraphToEpsTraits<G>(g,*new std::ofstream(file_name.c_str()),true));
1197
    (DefaultGraphToEpsTraits<G>(g,*os,true));
1187 1198
}
1188 1199

	
1189 1200
} //END OF NAMESPACE LEMON
1190 1201

	
1191 1202
#endif // LEMON_GRAPH_TO_EPS_H
Ignore white space 6 line context
... ...
@@ -45,17 +45,19 @@
45 45

	
46 46
    template <typename Value>
47 47
    struct DefaultConverter {
48 48
      Value operator()(const std::string& str) {
49 49
        std::istringstream is(str);
50 50
        Value value;
51
        is >> value;
51
        if (!(is >> value)) {
52
          throw FormatError("Cannot read token");
53
        }
52 54

	
53 55
        char c;
54 56
        if (is >> std::ws >> c) {
55
          throw DataFormatError("Remaining characters in token");
57
          throw FormatError("Remaining characters in token");
56 58
        }
57 59
        return value;
58 60
      }
59 61
    };
60 62

	
61 63
    template <>
... ...
@@ -163,13 +165,13 @@
163 165
      Value operator()(const std::string& str) {
164 166
        typename std::map<std::string, Value>::const_iterator it =
165 167
          _map.find(str);
166 168
        if (it == _map.end()) {
167 169
          std::ostringstream msg;
168 170
          msg << "Item not found: " << str;
169
          throw DataFormatError(msg.str().c_str());
171
          throw FormatError(msg.str());
170 172
        }
171 173
        return it->second;
172 174
      }
173 175
    };
174 176

	
175 177
    template <typename Graph>
... ...
@@ -181,18 +183,18 @@
181 183
                              const std::map<std::string,
182 184
                                             typename Graph::Edge>& map)
183 185
        : _graph(graph), _map(map) {}
184 186

	
185 187
      typename Graph::Arc operator()(const std::string& str) {
186 188
        if (str.empty() || (str[0] != '+' && str[0] != '-')) {
187
          throw DataFormatError("Item must start with '+' or '-'");
189
          throw FormatError("Item must start with '+' or '-'");
188 190
        }
189 191
        typename std::map<std::string, typename Graph::Edge>
190 192
          ::const_iterator it = _map.find(str.substr(1));
191 193
        if (it == _map.end()) {
192
          throw DataFormatError("Item not found");
194
          throw FormatError("Item not found");
193 195
        }
194 196
        return _graph.direct(it->second, str[0] == '+');
195 197
      }
196 198
    };
197 199

	
198 200
    inline bool isWhiteSpace(char c) {
... ...
@@ -232,13 +234,13 @@
232 234
        ('0' <= c && c <= '9');
233 235
    }
234 236

	
235 237
    inline char readEscape(std::istream& is) {
236 238
      char c;
237 239
      if (!is.get(c))
238
        throw DataFormatError("Escape format error");
240
        throw FormatError("Escape format error");
239 241

	
240 242
      switch (c) {
241 243
      case '\\':
242 244
        return '\\';
243 245
      case '\"':
244 246
        return '\"';
... ...
@@ -261,22 +263,22 @@
261 263
      case 'v':
262 264
        return '\v';
263 265
      case 'x':
264 266
        {
265 267
          int code;
266 268
          if (!is.get(c) || !isHex(c))
267
            throw DataFormatError("Escape format error");
269
            throw FormatError("Escape format error");
268 270
          else if (code = valueHex(c), !is.get(c) || !isHex(c)) is.putback(c);
269 271
          else code = code * 16 + valueHex(c);
270 272
          return code;
271 273
        }
272 274
      default:
273 275
        {
274 276
          int code;
275 277
          if (!isOct(c))
276
            throw DataFormatError("Escape format error");
278
            throw FormatError("Escape format error");
277 279
          else if (code = valueOct(c), !is.get(c) || !isOct(c))
278 280
            is.putback(c);
279 281
          else if (code = code * 8 + valueOct(c), !is.get(c) || !isOct(c))
280 282
            is.putback(c);
281 283
          else code = code * 8 + valueOct(c);
282 284
          return code;
... ...
@@ -297,13 +299,13 @@
297 299
        while (is.get(c) && c != '\"') {
298 300
          if (c == '\\')
299 301
            c = readEscape(is);
300 302
          os << c;
301 303
        }
302 304
        if (!is)
303
          throw DataFormatError("Quoted format error");
305
          throw FormatError("Quoted format error");
304 306
      } else {
305 307
        is.putback(c);
306 308
        while (is.get(c) && !isWhiteSpace(c)) {
307 309
          if (c == '\\')
308 310
            c = readEscape(is);
309 311
          os << c;
... ...
@@ -457,12 +459,13 @@
457 459

	
458 460
  private:
459 461

	
460 462

	
461 463
    std::istream* _is;
462 464
    bool local_is;
465
    std::string _filename;
463 466

	
464 467
    Digraph& _digraph;
465 468

	
466 469
    std::string _nodes_caption;
467 470
    std::string _arcs_caption;
468 471
    std::string _attributes_caption;
... ...
@@ -506,24 +509,30 @@
506 509

	
507 510
    /// \brief Constructor
508 511
    ///
509 512
    /// Construct a directed graph reader, which reads from the given
510 513
    /// file.
511 514
    DigraphReader(const std::string& fn, Digraph& digraph)
512
      : _is(new std::ifstream(fn.c_str())), local_is(true), _digraph(digraph),
515
      : _is(new std::ifstream(fn.c_str())), local_is(true),
516
        _filename(fn), _digraph(digraph),
513 517
        _use_nodes(false), _use_arcs(false),
514
        _skip_nodes(false), _skip_arcs(false) {}
518
        _skip_nodes(false), _skip_arcs(false) {
519
      if (!(*_is)) throw IoError(fn, "Cannot open file");
520
    }
515 521

	
516 522
    /// \brief Constructor
517 523
    ///
518 524
    /// Construct a directed graph reader, which reads from the given
519 525
    /// file.
520 526
    DigraphReader(const char* fn, Digraph& digraph)
521
      : _is(new std::ifstream(fn)), local_is(true), _digraph(digraph),
527
      : _is(new std::ifstream(fn)), local_is(true),
528
        _filename(fn), _digraph(digraph),
522 529
        _use_nodes(false), _use_arcs(false),
523
        _skip_nodes(false), _skip_arcs(false) {}
530
        _skip_nodes(false), _skip_arcs(false) {
531
      if (!(*_is)) throw IoError(fn, "Cannot open file");
532
    }
524 533

	
525 534
    /// \brief Destructor
526 535
    ~DigraphReader() {
527 536
      for (typename NodeMaps::iterator it = _node_maps.begin();
528 537
           it != _node_maps.end(); ++it) {
529 538
        delete it->second;
... ...
@@ -842,13 +851,13 @@
842 851
      int map_num, label_index;
843 852

	
844 853
      char c;
845 854
      if (!readLine() || !(line >> c) || c == '@') {
846 855
        if (readSuccess() && line) line.putback(c);
847 856
        if (!_node_maps.empty())
848
          throw DataFormatError("Cannot find map names");
857
          throw FormatError("Cannot find map names");
849 858
        return;
850 859
      }
851 860
      line.putback(c);
852 861

	
853 862
      {
854 863
        std::map<std::string, int> maps;
... ...
@@ -856,25 +865,25 @@
856 865
        std::string map;
857 866
        int index = 0;
858 867
        while (_reader_bits::readToken(line, map)) {
859 868
          if (maps.find(map) != maps.end()) {
860 869
            std::ostringstream msg;
861 870
            msg << "Multiple occurence of node map: " << map;
862
            throw DataFormatError(msg.str().c_str());
871
            throw FormatError(msg.str());
863 872
          }
864 873
          maps.insert(std::make_pair(map, index));
865 874
          ++index;
866 875
        }
867 876

	
868 877
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
869 878
          std::map<std::string, int>::iterator jt =
870 879
            maps.find(_node_maps[i].first);
871 880
          if (jt == maps.end()) {
872 881
            std::ostringstream msg;
873 882
            msg << "Map not found in file: " << _node_maps[i].first;
874
            throw DataFormatError(msg.str().c_str());
883
            throw FormatError(msg.str());
875 884
          }
876 885
          map_index[i] = jt->second;
877 886
        }
878 887

	
879 888
        {
880 889
          std::map<std::string, int>::iterator jt = maps.find("label");
... ...
@@ -892,32 +901,32 @@
892 901

	
893 902
        std::vector<std::string> tokens(map_num);
894 903
        for (int i = 0; i < map_num; ++i) {
895 904
          if (!_reader_bits::readToken(line, tokens[i])) {
896 905
            std::ostringstream msg;
897 906
            msg << "Column not found (" << i + 1 << ")";
898
            throw DataFormatError(msg.str().c_str());
907
            throw FormatError(msg.str());
899 908
          }
900 909
        }
901 910
        if (line >> std::ws >> c)
902
          throw DataFormatError("Extra character on the end of line");
911
          throw FormatError("Extra character on the end of line");
903 912

	
904 913
        Node n;
905 914
        if (!_use_nodes) {
906 915
          n = _digraph.addNode();
907 916
          if (label_index != -1)
908 917
            _node_index.insert(std::make_pair(tokens[label_index], n));
909 918
        } else {
910 919
          if (label_index == -1)
911
            throw DataFormatError("Label map not found in file");
920
            throw FormatError("Label map not found in file");
912 921
          typename std::map<std::string, Node>::iterator it =
913 922
            _node_index.find(tokens[label_index]);
914 923
          if (it == _node_index.end()) {
915 924
            std::ostringstream msg;
916 925
            msg << "Node with label not found: " << tokens[label_index];
917
            throw DataFormatError(msg.str().c_str());
926
            throw FormatError(msg.str());
918 927
          }
919 928
          n = it->second;
920 929
        }
921 930

	
922 931
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
923 932
          _node_maps[i].second->set(n, tokens[map_index[i]]);
... ...
@@ -935,13 +944,13 @@
935 944
      int map_num, label_index;
936 945

	
937 946
      char c;
938 947
      if (!readLine() || !(line >> c) || c == '@') {
939 948
        if (readSuccess() && line) line.putback(c);
940 949
        if (!_arc_maps.empty())
941
          throw DataFormatError("Cannot find map names");
950
          throw FormatError("Cannot find map names");
942 951
        return;
943 952
      }
944 953
      line.putback(c);
945 954

	
946 955
      {
947 956
        std::map<std::string, int> maps;
... ...
@@ -949,25 +958,25 @@
949 958
        std::string map;
950 959
        int index = 0;
951 960
        while (_reader_bits::readToken(line, map)) {
952 961
          if (maps.find(map) != maps.end()) {
953 962
            std::ostringstream msg;
954 963
            msg << "Multiple occurence of arc map: " << map;
955
            throw DataFormatError(msg.str().c_str());
964
            throw FormatError(msg.str());
956 965
          }
957 966
          maps.insert(std::make_pair(map, index));
958 967
          ++index;
959 968
        }
960 969

	
961 970
        for (int i = 0; i < static_cast<int>(_arc_maps.size()); ++i) {
962 971
          std::map<std::string, int>::iterator jt =
963 972
            maps.find(_arc_maps[i].first);
964 973
          if (jt == maps.end()) {
965 974
            std::ostringstream msg;
966 975
            msg << "Map not found in file: " << _arc_maps[i].first;
967
            throw DataFormatError(msg.str().c_str());
976
            throw FormatError(msg.str());
968 977
          }
969 978
          map_index[i] = jt->second;
970 979
        }
971 980

	
972 981
        {
973 982
          std::map<std::string, int>::iterator jt = maps.find("label");
... ...
@@ -984,61 +993,61 @@
984 993
        line.putback(c);
985 994

	
986 995
        std::string source_token;
987 996
        std::string target_token;
988 997

	
989 998
        if (!_reader_bits::readToken(line, source_token))
990
          throw DataFormatError("Source not found");
999
          throw FormatError("Source not found");
991 1000

	
992 1001
        if (!_reader_bits::readToken(line, target_token))
993
          throw DataFormatError("Target not found");
1002
          throw FormatError("Target not found");
994 1003

	
995 1004
        std::vector<std::string> tokens(map_num);
996 1005
        for (int i = 0; i < map_num; ++i) {
997 1006
          if (!_reader_bits::readToken(line, tokens[i])) {
998 1007
            std::ostringstream msg;
999 1008
            msg << "Column not found (" << i + 1 << ")";
1000
            throw DataFormatError(msg.str().c_str());
1009
            throw FormatError(msg.str());
1001 1010
          }
1002 1011
        }
1003 1012
        if (line >> std::ws >> c)
1004
          throw DataFormatError("Extra character on the end of line");
1013
          throw FormatError("Extra character on the end of line");
1005 1014

	
1006 1015
        Arc a;
1007 1016
        if (!_use_arcs) {
1008 1017

	
1009 1018
          typename NodeIndex::iterator it;
1010 1019

	
1011 1020
          it = _node_index.find(source_token);
1012 1021
          if (it == _node_index.end()) {
1013 1022
            std::ostringstream msg;
1014 1023
            msg << "Item not found: " << source_token;
1015
            throw DataFormatError(msg.str().c_str());
1024
            throw FormatError(msg.str());
1016 1025
          }
1017 1026
          Node source = it->second;
1018 1027

	
1019 1028
          it = _node_index.find(target_token);
1020 1029
          if (it == _node_index.end()) {
1021 1030
            std::ostringstream msg;
1022 1031
            msg << "Item not found: " << target_token;
1023
            throw DataFormatError(msg.str().c_str());
1032
            throw FormatError(msg.str());
1024 1033
          }
1025 1034
          Node target = it->second;
1026 1035

	
1027 1036
          a = _digraph.addArc(source, target);
1028 1037
          if (label_index != -1)
1029 1038
            _arc_index.insert(std::make_pair(tokens[label_index], a));
1030 1039
        } else {
1031 1040
          if (label_index == -1)
1032
            throw DataFormatError("Label map not found in file");
1041
            throw FormatError("Label map not found in file");
1033 1042
          typename std::map<std::string, Arc>::iterator it =
1034 1043
            _arc_index.find(tokens[label_index]);
1035 1044
          if (it == _arc_index.end()) {
1036 1045
            std::ostringstream msg;
1037 1046
            msg << "Arc with label not found: " << tokens[label_index];
1038
            throw DataFormatError(msg.str().c_str());
1047
            throw FormatError(msg.str());
1039 1048
          }
1040 1049
          a = it->second;
1041 1050
        }
1042 1051

	
1043 1052
        for (int i = 0; i < static_cast<int>(_arc_maps.size()); ++i) {
1044 1053
          _arc_maps[i].second->set(a, tokens[map_index[i]]);
... ...
@@ -1057,24 +1066,24 @@
1057 1066
      char c;
1058 1067
      while (readLine() && line >> c && c != '@') {
1059 1068
        line.putback(c);
1060 1069

	
1061 1070
        std::string attr, token;
1062 1071
        if (!_reader_bits::readToken(line, attr))
1063
          throw DataFormatError("Attribute name not found");
1072
          throw FormatError("Attribute name not found");
1064 1073
        if (!_reader_bits::readToken(line, token))
1065
          throw DataFormatError("Attribute value not found");
1074
          throw FormatError("Attribute value not found");
1066 1075
        if (line >> c)
1067
          throw DataFormatError("Extra character on the end of line");
1076
          throw FormatError("Extra character on the end of line");
1068 1077

	
1069 1078
        {
1070 1079
          std::set<std::string>::iterator it = read_attr.find(attr);
1071 1080
          if (it != read_attr.end()) {
1072 1081
            std::ostringstream msg;
1073 1082
            msg << "Multiple occurence of attribute " << attr;
1074
            throw DataFormatError(msg.str().c_str());
1083
            throw FormatError(msg.str());
1075 1084
          }
1076 1085
          read_attr.insert(attr);
1077 1086
        }
1078 1087

	
1079 1088
        {
1080 1089
          typename Attributes::iterator it = _attributes.lower_bound(attr);
... ...
@@ -1090,13 +1099,13 @@
1090 1099
      }
1091 1100
      for (typename Attributes::iterator it = _attributes.begin();
1092 1101
           it != _attributes.end(); ++it) {
1093 1102
        if (read_attr.find(it->first) == read_attr.end()) {
1094 1103
          std::ostringstream msg;
1095 1104
          msg << "Attribute not found in file: " << it->first;
1096
          throw DataFormatError(msg.str().c_str());
1105
          throw FormatError(msg.str());
1097 1106
        }
1098 1107
      }
1099 1108
    }
1100 1109

	
1101 1110
  public:
1102 1111

	
... ...
@@ -1106,13 +1115,13 @@
1106 1115
    /// \brief Start the batch processing
1107 1116
    ///
1108 1117
    /// This function starts the batch processing
1109 1118
    void run() {
1110 1119
      LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
1111 1120
      if (!*_is) {
1112
        throw DataFormatError("Cannot find file");
1121
        throw FormatError("Cannot find file");
1113 1122
      }
1114 1123

	
1115 1124
      bool nodes_done = _skip_nodes;
1116 1125
      bool arcs_done = _skip_arcs;
1117 1126
      bool attributes_done = false;
1118 1127

	
... ...
@@ -1126,13 +1135,13 @@
1126 1135
          std::string section, caption;
1127 1136
          line >> c;
1128 1137
          _reader_bits::readToken(line, section);
1129 1138
          _reader_bits::readToken(line, caption);
1130 1139

	
1131 1140
          if (line >> c)
1132
            throw DataFormatError("Extra character on the end of line");
1141
            throw FormatError("Extra character on the end of line");
1133 1142

	
1134 1143
          if (section == "nodes" && !nodes_done) {
1135 1144
            if (_nodes_caption.empty() || _nodes_caption == caption) {
1136 1145
              readNodes();
1137 1146
              nodes_done = true;
1138 1147
            }
... ...
@@ -1148,28 +1157,29 @@
1148 1157
              attributes_done = true;
1149 1158
            }
1150 1159
          } else {
1151 1160
            readLine();
1152 1161
            skipSection();
1153 1162
          }
1154
        } catch (DataFormatError& error) {
1163
        } catch (FormatError& error) {
1155 1164
          error.line(line_num);
1165
          error.file(_filename);
1156 1166
          throw;
1157 1167
        }
1158 1168
      }
1159 1169

	
1160 1170
      if (!nodes_done) {
1161
        throw DataFormatError("Section @nodes not found");
1171
        throw FormatError("Section @nodes not found");
1162 1172
      }
1163 1173

	
1164 1174
      if (!arcs_done) {
1165
        throw DataFormatError("Section @arcs not found");
1175
        throw FormatError("Section @arcs not found");
1166 1176
      }
1167 1177

	
1168 1178
      if (!attributes_done && !_attributes.empty()) {
1169
        throw DataFormatError("Section @attributes not found");
1179
        throw FormatError("Section @attributes not found");
1170 1180
      }
1171 1181

	
1172 1182
    }
1173 1183

	
1174 1184
    /// @}
1175 1185

	
... ...
@@ -1241,12 +1251,13 @@
1241 1251
    TEMPLATE_GRAPH_TYPEDEFS(Graph);
1242 1252

	
1243 1253
  private:
1244 1254

	
1245 1255
    std::istream* _is;
1246 1256
    bool local_is;
1257
    std::string _filename;
1247 1258

	
1248 1259
    Graph& _graph;
1249 1260

	
1250 1261
    std::string _nodes_caption;
1251 1262
    std::string _edges_caption;
1252 1263
    std::string _attributes_caption;
... ...
@@ -1290,24 +1301,30 @@
1290 1301

	
1291 1302
    /// \brief Constructor
1292 1303
    ///
1293 1304
    /// Construct an undirected graph reader, which reads from the given
1294 1305
    /// file.
1295 1306
    GraphReader(const std::string& fn, Graph& graph)
1296
      : _is(new std::ifstream(fn.c_str())), local_is(true), _graph(graph),
1307
      : _is(new std::ifstream(fn.c_str())), local_is(true),
1308
        _filename(fn), _graph(graph),
1297 1309
        _use_nodes(false), _use_edges(false),
1298
        _skip_nodes(false), _skip_edges(false) {}
1310
        _skip_nodes(false), _skip_edges(false) {
1311
      if (!(*_is)) throw IoError(fn, "Cannot open file");
1312
    }
1299 1313

	
1300 1314
    /// \brief Constructor
1301 1315
    ///
1302 1316
    /// Construct an undirected graph reader, which reads from the given
1303 1317
    /// file.
1304 1318
    GraphReader(const char* fn, Graph& graph)
1305
      : _is(new std::ifstream(fn)), local_is(true), _graph(graph),
1319
      : _is(new std::ifstream(fn)), local_is(true),
1320
        _filename(fn), _graph(graph),
1306 1321
        _use_nodes(false), _use_edges(false),
1307
        _skip_nodes(false), _skip_edges(false) {}
1322
        _skip_nodes(false), _skip_edges(false) {
1323
      if (!(*_is)) throw IoError(fn, "Cannot open file");
1324
    }
1308 1325

	
1309 1326
    /// \brief Destructor
1310 1327
    ~GraphReader() {
1311 1328
      for (typename NodeMaps::iterator it = _node_maps.begin();
1312 1329
           it != _node_maps.end(); ++it) {
1313 1330
        delete it->second;
... ...
@@ -1670,13 +1687,13 @@
1670 1687
      int map_num, label_index;
1671 1688

	
1672 1689
      char c;
1673 1690
      if (!readLine() || !(line >> c) || c == '@') {
1674 1691
        if (readSuccess() && line) line.putback(c);
1675 1692
        if (!_node_maps.empty())
1676
          throw DataFormatError("Cannot find map names");
1693
          throw FormatError("Cannot find map names");
1677 1694
        return;
1678 1695
      }
1679 1696
      line.putback(c);
1680 1697

	
1681 1698
      {
1682 1699
        std::map<std::string, int> maps;
... ...
@@ -1684,25 +1701,25 @@
1684 1701
        std::string map;
1685 1702
        int index = 0;
1686 1703
        while (_reader_bits::readToken(line, map)) {
1687 1704
          if (maps.find(map) != maps.end()) {
1688 1705
            std::ostringstream msg;
1689 1706
            msg << "Multiple occurence of node map: " << map;
1690
            throw DataFormatError(msg.str().c_str());
1707
            throw FormatError(msg.str());
1691 1708
          }
1692 1709
          maps.insert(std::make_pair(map, index));
1693 1710
          ++index;
1694 1711
        }
1695 1712

	
1696 1713
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
1697 1714
          std::map<std::string, int>::iterator jt =
1698 1715
            maps.find(_node_maps[i].first);
1699 1716
          if (jt == maps.end()) {
1700 1717
            std::ostringstream msg;
1701 1718
            msg << "Map not found in file: " << _node_maps[i].first;
1702
            throw DataFormatError(msg.str().c_str());
1719
            throw FormatError(msg.str());
1703 1720
          }
1704 1721
          map_index[i] = jt->second;
1705 1722
        }
1706 1723

	
1707 1724
        {
1708 1725
          std::map<std::string, int>::iterator jt = maps.find("label");
... ...
@@ -1720,32 +1737,32 @@
1720 1737

	
1721 1738
        std::vector<std::string> tokens(map_num);
1722 1739
        for (int i = 0; i < map_num; ++i) {
1723 1740
          if (!_reader_bits::readToken(line, tokens[i])) {
1724 1741
            std::ostringstream msg;
1725 1742
            msg << "Column not found (" << i + 1 << ")";
1726
            throw DataFormatError(msg.str().c_str());
1743
            throw FormatError(msg.str());
1727 1744
          }
1728 1745
        }
1729 1746
        if (line >> std::ws >> c)
1730
          throw DataFormatError("Extra character on the end of line");
1747
          throw FormatError("Extra character on the end of line");
1731 1748

	
1732 1749
        Node n;
1733 1750
        if (!_use_nodes) {
1734 1751
          n = _graph.addNode();
1735 1752
          if (label_index != -1)
1736 1753
            _node_index.insert(std::make_pair(tokens[label_index], n));
1737 1754
        } else {
1738 1755
          if (label_index == -1)
1739
            throw DataFormatError("Label map not found in file");
1756
            throw FormatError("Label map not found in file");
1740 1757
          typename std::map<std::string, Node>::iterator it =
1741 1758
            _node_index.find(tokens[label_index]);
1742 1759
          if (it == _node_index.end()) {
1743 1760
            std::ostringstream msg;
1744 1761
            msg << "Node with label not found: " << tokens[label_index];
1745
            throw DataFormatError(msg.str().c_str());
1762
            throw FormatError(msg.str());
1746 1763
          }
1747 1764
          n = it->second;
1748 1765
        }
1749 1766

	
1750 1767
        for (int i = 0; i < static_cast<int>(_node_maps.size()); ++i) {
1751 1768
          _node_maps[i].second->set(n, tokens[map_index[i]]);
... ...
@@ -1763,13 +1780,13 @@
1763 1780
      int map_num, label_index;
1764 1781

	
1765 1782
      char c;
1766 1783
      if (!readLine() || !(line >> c) || c == '@') {
1767 1784
        if (readSuccess() && line) line.putback(c);
1768 1785
        if (!_edge_maps.empty())
1769
          throw DataFormatError("Cannot find map names");
1786
          throw FormatError("Cannot find map names");
1770 1787
        return;
1771 1788
      }
1772 1789
      line.putback(c);
1773 1790

	
1774 1791
      {
1775 1792
        std::map<std::string, int> maps;
... ...
@@ -1777,25 +1794,25 @@
1777 1794
        std::string map;
1778 1795
        int index = 0;
1779 1796
        while (_reader_bits::readToken(line, map)) {
1780 1797
          if (maps.find(map) != maps.end()) {
1781 1798
            std::ostringstream msg;
1782 1799
            msg << "Multiple occurence of edge map: " << map;
1783
            throw DataFormatError(msg.str().c_str());
1800
            throw FormatError(msg.str());
1784 1801
          }
1785 1802
          maps.insert(std::make_pair(map, index));
1786 1803
          ++index;
1787 1804
        }
1788 1805

	
1789 1806
        for (int i = 0; i < static_cast<int>(_edge_maps.size()); ++i) {
1790 1807
          std::map<std::string, int>::iterator jt =
1791 1808
            maps.find(_edge_maps[i].first);
1792 1809
          if (jt == maps.end()) {
1793 1810
            std::ostringstream msg;
1794 1811
            msg << "Map not found in file: " << _edge_maps[i].first;
1795
            throw DataFormatError(msg.str().c_str());
1812
            throw FormatError(msg.str());
1796 1813
          }
1797 1814
          map_index[i] = jt->second;
1798 1815
        }
1799 1816

	
1800 1817
        {
1801 1818
          std::map<std::string, int>::iterator jt = maps.find("label");
... ...
@@ -1812,61 +1829,61 @@
1812 1829
        line.putback(c);
1813 1830

	
1814 1831
        std::string source_token;
1815 1832
        std::string target_token;
1816 1833

	
1817 1834
        if (!_reader_bits::readToken(line, source_token))
1818
          throw DataFormatError("Node u not found");
1835
          throw FormatError("Node u not found");
1819 1836

	
1820 1837
        if (!_reader_bits::readToken(line, target_token))
1821
          throw DataFormatError("Node v not found");
1838
          throw FormatError("Node v not found");
1822 1839

	
1823 1840
        std::vector<std::string> tokens(map_num);
1824 1841
        for (int i = 0; i < map_num; ++i) {
1825 1842
          if (!_reader_bits::readToken(line, tokens[i])) {
1826 1843
            std::ostringstream msg;
1827 1844
            msg << "Column not found (" << i + 1 << ")";
1828
            throw DataFormatError(msg.str().c_str());
1845
            throw FormatError(msg.str());
1829 1846
          }
1830 1847
        }
1831 1848
        if (line >> std::ws >> c)
1832
          throw DataFormatError("Extra character on the end of line");
1849
          throw FormatError("Extra character on the end of line");
1833 1850

	
1834 1851
        Edge e;
1835 1852
        if (!_use_edges) {
1836 1853

	
1837 1854
          typename NodeIndex::iterator it;
1838 1855

	
1839 1856
          it = _node_index.find(source_token);
1840 1857
          if (it == _node_index.end()) {
1841 1858
            std::ostringstream msg;
1842 1859
            msg << "Item not found: " << source_token;
1843
            throw DataFormatError(msg.str().c_str());
1860
            throw FormatError(msg.str());
1844 1861
          }
1845 1862
          Node source = it->second;
1846 1863

	
1847 1864
          it = _node_index.find(target_token);
1848 1865
          if (it == _node_index.end()) {
1849 1866
            std::ostringstream msg;
1850 1867
            msg << "Item not found: " << target_token;
1851
            throw DataFormatError(msg.str().c_str());
1868
            throw FormatError(msg.str());
1852 1869
          }
1853 1870
          Node target = it->second;
1854 1871

	
1855 1872
          e = _graph.addEdge(source, target);
1856 1873
          if (label_index != -1)
1857 1874
            _edge_index.insert(std::make_pair(tokens[label_index], e));
1858 1875
        } else {
1859 1876
          if (label_index == -1)
1860
            throw DataFormatError("Label map not found in file");
1877
            throw FormatError("Label map not found in file");
1861 1878
          typename std::map<std::string, Edge>::iterator it =
1862 1879
            _edge_index.find(tokens[label_index]);
1863 1880
          if (it == _edge_index.end()) {
1864 1881
            std::ostringstream msg;
1865 1882
            msg << "Edge with label not found: " << tokens[label_index];
1866
            throw DataFormatError(msg.str().c_str());
1883
            throw FormatError(msg.str());
1867 1884
          }
1868 1885
          e = it->second;
1869 1886
        }
1870 1887

	
1871 1888
        for (int i = 0; i < static_cast<int>(_edge_maps.size()); ++i) {
1872 1889
          _edge_maps[i].second->set(e, tokens[map_index[i]]);
... ...
@@ -1885,24 +1902,24 @@
1885 1902
      char c;
1886 1903
      while (readLine() && line >> c && c != '@') {
1887 1904
        line.putback(c);
1888 1905

	
1889 1906
        std::string attr, token;
1890 1907
        if (!_reader_bits::readToken(line, attr))
1891
          throw DataFormatError("Attribute name not found");
1908
          throw FormatError("Attribute name not found");
1892 1909
        if (!_reader_bits::readToken(line, token))
1893
          throw DataFormatError("Attribute value not found");
1910
          throw FormatError("Attribute value not found");
1894 1911
        if (line >> c)
1895
          throw DataFormatError("Extra character on the end of line");
1912
          throw FormatError("Extra character on the end of line");
1896 1913

	
1897 1914
        {
1898 1915
          std::set<std::string>::iterator it = read_attr.find(attr);
1899 1916
          if (it != read_attr.end()) {
1900 1917
            std::ostringstream msg;
1901 1918
            msg << "Multiple occurence of attribute " << attr;
1902
            throw DataFormatError(msg.str().c_str());
1919
            throw FormatError(msg.str());
1903 1920
          }
1904 1921
          read_attr.insert(attr);
1905 1922
        }
1906 1923

	
1907 1924
        {
1908 1925
          typename Attributes::iterator it = _attributes.lower_bound(attr);
... ...
@@ -1918,13 +1935,13 @@
1918 1935
      }
1919 1936
      for (typename Attributes::iterator it = _attributes.begin();
1920 1937
           it != _attributes.end(); ++it) {
1921 1938
        if (read_attr.find(it->first) == read_attr.end()) {
1922 1939
          std::ostringstream msg;
1923 1940
          msg << "Attribute not found in file: " << it->first;
1924
          throw DataFormatError(msg.str().c_str());
1941
          throw FormatError(msg.str());
1925 1942
        }
1926 1943
      }
1927 1944
    }
1928 1945

	
1929 1946
  public:
1930 1947

	
... ...
@@ -1952,13 +1969,13 @@
1952 1969
          std::string section, caption;
1953 1970
          line >> c;
1954 1971
          _reader_bits::readToken(line, section);
1955 1972
          _reader_bits::readToken(line, caption);
1956 1973

	
1957 1974
          if (line >> c)
1958
            throw DataFormatError("Extra character on the end of line");
1975
            throw FormatError("Extra character on the end of line");
1959 1976

	
1960 1977
          if (section == "nodes" && !nodes_done) {
1961 1978
            if (_nodes_caption.empty() || _nodes_caption == caption) {
1962 1979
              readNodes();
1963 1980
              nodes_done = true;
1964 1981
            }
... ...
@@ -1974,28 +1991,29 @@
1974 1991
              attributes_done = true;
1975 1992
            }
1976 1993
          } else {
1977 1994
            readLine();
1978 1995
            skipSection();
1979 1996
          }
1980
        } catch (DataFormatError& error) {
1997
        } catch (FormatError& error) {
1981 1998
          error.line(line_num);
1999
          error.file(_filename);
1982 2000
          throw;
1983 2001
        }
1984 2002
      }
1985 2003

	
1986 2004
      if (!nodes_done) {
1987
        throw DataFormatError("Section @nodes not found");
2005
        throw FormatError("Section @nodes not found");
1988 2006
      }
1989 2007

	
1990 2008
      if (!edges_done) {
1991
        throw DataFormatError("Section @edges not found");
2009
        throw FormatError("Section @edges not found");
1992 2010
      }
1993 2011

	
1994 2012
      if (!attributes_done && !_attributes.empty()) {
1995
        throw DataFormatError("Section @attributes not found");
2013
        throw FormatError("Section @attributes not found");
1996 2014
      }
1997 2015

	
1998 2016
    }
1999 2017

	
2000 2018
    /// @}
2001 2019

	
... ...
@@ -2051,12 +2069,13 @@
2051 2069
  /// stream.
2052 2070
  class SectionReader {
2053 2071
  private:
2054 2072

	
2055 2073
    std::istream* _is;
2056 2074
    bool local_is;
2075
    std::string _filename;
2057 2076

	
2058 2077
    typedef std::map<std::string, _reader_bits::Section*> Sections;
2059 2078
    Sections _sections;
2060 2079

	
2061 2080
    int line_num;
2062 2081
    std::istringstream line;
... ...
@@ -2071,19 +2090,25 @@
2071 2090
      : _is(&is), local_is(false) {}
2072 2091

	
2073 2092
    /// \brief Constructor
2074 2093
    ///
2075 2094
    /// Construct a section reader, which reads from the given file.
2076 2095
    SectionReader(const std::string& fn)
2077
      : _is(new std::ifstream(fn.c_str())), local_is(true) {}
2096
      : _is(new std::ifstream(fn.c_str())), local_is(true),
2097
        _filename(fn) {
2098
      if (!(*_is)) throw IoError(fn, "Cannot open file");
2099
    }
2078 2100

	
2079 2101
    /// \brief Constructor
2080 2102
    ///
2081 2103
    /// Construct a section reader, which reads from the given file.
2082 2104
    SectionReader(const char* fn)
2083
      : _is(new std::ifstream(fn)), local_is(true) {}
2105
      : _is(new std::ifstream(fn)), local_is(true),
2106
        _filename(fn) {
2107
      if (!(*_is)) throw IoError(fn, "Cannot open file");
2108
    }
2084 2109

	
2085 2110
    /// \brief Destructor
2086 2111
    ~SectionReader() {
2087 2112
      for (Sections::iterator it = _sections.begin();
2088 2113
           it != _sections.end(); ++it) {
2089 2114
        delete it->second;
... ...
@@ -2233,37 +2258,38 @@
2233 2258
          std::string section, caption;
2234 2259
          line >> c;
2235 2260
          _reader_bits::readToken(line, section);
2236 2261
          _reader_bits::readToken(line, caption);
2237 2262

	
2238 2263
          if (line >> c)
2239
            throw DataFormatError("Extra character on the end of line");
2264
            throw FormatError("Extra character on the end of line");
2240 2265

	
2241 2266
          if (extra_sections.find(section) != extra_sections.end()) {
2242 2267
            std::ostringstream msg;
2243 2268
            msg << "Multiple occurence of section " << section;
2244
            throw DataFormatError(msg.str().c_str());
2269
            throw FormatError(msg.str());
2245 2270
          }
2246 2271
          Sections::iterator it = _sections.find(section);
2247 2272
          if (it != _sections.end()) {
2248 2273
            extra_sections.insert(section);
2249 2274
            it->second->process(*_is, line_num);
2250 2275
          }
2251 2276
          readLine();
2252 2277
          skipSection();
2253
        } catch (DataFormatError& error) {
2278
        } catch (FormatError& error) {
2254 2279
          error.line(line_num);
2280
          error.file(_filename);
2255 2281
          throw;
2256 2282
        }
2257 2283
      }
2258 2284
      for (Sections::iterator it = _sections.begin();
2259 2285
           it != _sections.end(); ++it) {
2260 2286
        if (extra_sections.find(it->first) == extra_sections.end()) {
2261 2287
          std::ostringstream os;
2262 2288
          os << "Cannot find section: " << it->first;
2263
          throw DataFormatError(os.str().c_str());
2289
          throw FormatError(os.str());
2264 2290
        }
2265 2291
      }
2266 2292
    }
2267 2293

	
2268 2294
    /// @}
2269 2295

	
... ...
@@ -2357,20 +2383,24 @@
2357 2383

	
2358 2384
    /// \brief Constructor
2359 2385
    ///
2360 2386
    /// Construct an \e LGF contents reader, which reads from the given
2361 2387
    /// file.
2362 2388
    LgfContents(const std::string& fn)
2363
      : _is(new std::ifstream(fn.c_str())), local_is(true) {}
2389
      : _is(new std::ifstream(fn.c_str())), local_is(true) {
2390
      if (!(*_is)) throw IoError(fn, "Cannot open file");
2391
    }
2364 2392

	
2365 2393
    /// \brief Constructor
2366 2394
    ///
2367 2395
    /// Construct an \e LGF contents reader, which reads from the given
2368 2396
    /// file.
2369 2397
    LgfContents(const char* fn)
2370
      : _is(new std::ifstream(fn)), local_is(true) {}
2398
      : _is(new std::ifstream(fn)), local_is(true) {
2399
      if (!(*_is)) throw IoError(fn, "Cannot open file");
2400
    }
2371 2401

	
2372 2402
    /// \brief Destructor
2373 2403
    ~LgfContents() {
2374 2404
      if (local_is) delete _is;
2375 2405
    }
2376 2406

	
Ignore white space 6 line context
... ...
@@ -52,13 +52,13 @@
52 52
        return os.str();
53 53
      }
54 54
    };
55 55

	
56 56
    template <typename T>
57 57
    bool operator<(const T&, const T&) {
58
      throw DataFormatError("Label map is not comparable");
58
      throw FormatError("Label map is not comparable");
59 59
    }
60 60

	
61 61
    template <typename _Map>
62 62
    class MapLess {
63 63
    public:
64 64
      typedef _Map Map;
... ...
@@ -200,13 +200,13 @@
200 200
        : _map(map) {}
201 201

	
202 202
      std::string operator()(const Value& str) {
203 203
        typename std::map<Value, std::string>::const_iterator it =
204 204
          _map.find(str);
205 205
        if (it == _map.end()) {
206
          throw DataFormatError("Item not found");
206
          throw FormatError("Item not found");
207 207
        }
208 208
        return it->second;
209 209
      }
210 210
    };
211 211

	
212 212
    template <typename Graph>
... ...
@@ -220,13 +220,13 @@
220 220
        : _graph(graph), _map(map) {}
221 221

	
222 222
      std::string operator()(const typename Graph::Arc& val) {
223 223
        typename std::map<typename Graph::Edge, std::string>
224 224
          ::const_iterator it = _map.find(val);
225 225
        if (it == _map.end()) {
226
          throw DataFormatError("Item not found");
226
          throw FormatError("Item not found");
227 227
        }
228 228
        return (_graph.direction(val) ? '+' : '-') + it->second;
229 229
      }
230 230
    };
231 231

	
232 232
    inline bool isWhiteSpace(char c) {
... ...
@@ -459,21 +459,25 @@
459 459
    /// \brief Constructor
460 460
    ///
461 461
    /// Construct a directed graph writer, which writes to the given
462 462
    /// output file.
463 463
    DigraphWriter(const std::string& fn, const Digraph& digraph)
464 464
      : _os(new std::ofstream(fn.c_str())), local_os(true), _digraph(digraph),
465
        _skip_nodes(false), _skip_arcs(false) {}
465
        _skip_nodes(false), _skip_arcs(false) {
466
      if (!(*_os)) throw IoError(fn, "Cannot write file");
467
    }
466 468

	
467 469
    /// \brief Constructor
468 470
    ///
469 471
    /// Construct a directed graph writer, which writes to the given
470 472
    /// output file.
471 473
    DigraphWriter(const char* fn, const Digraph& digraph)
472 474
      : _os(new std::ofstream(fn)), local_os(true), _digraph(digraph),
473
        _skip_nodes(false), _skip_arcs(false) {}
475
        _skip_nodes(false), _skip_arcs(false) {
476
      if (!(*_os)) throw IoError(fn, "Cannot write file");
477
    }
474 478

	
475 479
    /// \brief Destructor
476 480
    ~DigraphWriter() {
477 481
      for (typename NodeMaps::iterator it = _node_maps.begin();
478 482
           it != _node_maps.end(); ++it) {
479 483
        delete it->second;
... ...
@@ -1015,21 +1019,25 @@
1015 1019
    /// \brief Constructor
1016 1020
    ///
1017 1021
    /// Construct a directed graph writer, which writes to the given
1018 1022
    /// output file.
1019 1023
    GraphWriter(const std::string& fn, const Graph& graph)
1020 1024
      : _os(new std::ofstream(fn.c_str())), local_os(true), _graph(graph),
1021
        _skip_nodes(false), _skip_edges(false) {}
1025
        _skip_nodes(false), _skip_edges(false) {
1026
      if (!(*_os)) throw IoError(fn, "Cannot write file");
1027
    }
1022 1028

	
1023 1029
    /// \brief Constructor
1024 1030
    ///
1025 1031
    /// Construct a directed graph writer, which writes to the given
1026 1032
    /// output file.
1027 1033
    GraphWriter(const char* fn, const Graph& graph)
1028 1034
      : _os(new std::ofstream(fn)), local_os(true), _graph(graph),
1029
        _skip_nodes(false), _skip_edges(false) {}
1035
        _skip_nodes(false), _skip_edges(false) {
1036
      if (!(*_os)) throw IoError(fn, "Cannot write file");
1037
    }
1030 1038

	
1031 1039
    /// \brief Destructor
1032 1040
    ~GraphWriter() {
1033 1041
      for (typename NodeMaps::iterator it = _node_maps.begin();
1034 1042
           it != _node_maps.end(); ++it) {
1035 1043
        delete it->second;
... ...
@@ -1573,19 +1581,23 @@
1573 1581
      : _os(&os), local_os(false) {}
1574 1582

	
1575 1583
    /// \brief Constructor
1576 1584
    ///
1577 1585
    /// Construct a section writer, which writes into the given file.
1578 1586
    SectionWriter(const std::string& fn)
1579
      : _os(new std::ofstream(fn.c_str())), local_os(true) {}
1587
      : _os(new std::ofstream(fn.c_str())), local_os(true) {
1588
      if (!(*_os)) throw IoError(fn, "Cannot write file");
1589
    }
1580 1590

	
1581 1591
    /// \brief Constructor
1582 1592
    ///
1583 1593
    /// Construct a section writer, which writes into the given file.
1584 1594
    SectionWriter(const char* fn)
1585
      : _os(new std::ofstream(fn)), local_os(true) {}
1595
      : _os(new std::ofstream(fn)), local_os(true) {
1596
      if (!(*_os)) throw IoError(fn, "Cannot write file");
1597
    }
1586 1598

	
1587 1599
    /// \brief Destructor
1588 1600
    ~SectionWriter() {
1589 1601
      for (Sections::iterator it = _sections.begin();
1590 1602
           it != _sections.end(); ++it) {
1591 1603
        delete it->second;
0 comments (0 inline)