Skip to content

Commit 75ee501

Browse files
Refine parse error handling in read_pp_upf201
1 parent 39c4f54 commit 75ee501

1 file changed

Lines changed: 31 additions & 18 deletions

File tree

source/source_cell/read_pp_upf201.cpp

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
#include "read_pp.h"
2+
#include <string>
3+
#include <stdexcept>
24

35
// qianrui rewrite it 2021-5-10
46
// liuyu update 2023-09-17 add uspp support
@@ -197,47 +199,58 @@ void Pseudopot_upf::getnameval(std::ifstream& ifs, int& n, std::string* name, st
197199

198200
namespace // Helper functions for subsequent type conversion
199201
{
200-
int parse_int(const std::string& s)
202+
int parse_int(const std::string& s, const std::string& key)
201203
{
202204
size_t pos = 0;
203205
int value = 0;
206+
204207
try
205208
{
206209
value = std::stoi(s, &pos);
207210
}
208-
catch (...)
211+
catch (const std::invalid_argument&)
212+
{
213+
ModuleBase::WARNING_QUIT("read_pp_upf201::parse_int",
214+
"Invalid integer value for " + key + ": " + s);
215+
}
216+
catch (const std::out_of_range&)
209217
{
210218
ModuleBase::WARNING_QUIT("read_pp_upf201::parse_int",
211-
"Invalid integer value: " + s);
219+
"Out-of-range integer value for " + key + ": " + s);
212220
}
213221

214222
if (pos != s.size())
215223
{
216224
ModuleBase::WARNING_QUIT("read_pp_upf201::parse_int",
217-
"Invalid integer value (extra characters): " + s);
225+
"Invalid integer value for " + key + " (extra characters): " + s);
218226
}
219227

220228
return value;
221229
}
222230

223-
double parse_double(const std::string& s)
231+
double parse_double(const std::string& s, const std::string& key)
224232
{
225233
size_t pos = 0;
226234
double value = 0.0;
227235
try
228236
{
229237
value = std::stod(s, &pos);
230238
}
231-
catch (...)
239+
catch (const std::invalid_argument&)
240+
{
241+
ModuleBase::WARNING_QUIT("read_pp_upf201::parse_double",
242+
"Invalid floating-point value for " + key + ": " + s);
243+
}
244+
catch (const std::out_of_range&)
232245
{
233246
ModuleBase::WARNING_QUIT("read_pp_upf201::parse_double",
234-
"Invalid floating-point value: " + s);
247+
"Out-of-range floating-point value for " + key + ": " + s);
235248
}
236249

237250
if (pos != s.size())
238251
{
239252
ModuleBase::WARNING_QUIT("read_pp_upf201::parse_double",
240-
"Invalid floating-point value (extra characters): " + s);
253+
"Invalid floating-point value for " + key + " (extra characters): " + s);
241254
}
242255

243256
return value;
@@ -352,35 +365,35 @@ void Pseudopot_upf::read_pseudo_upf201_header(std::ifstream& ifs, Atom_pseudo& p
352365
}
353366
else if (name[ip] == "z_valence")
354367
{
355-
pp.zv = parse_double(val[ip]);
368+
pp.zv = parse_double(val[ip],name[ip]);
356369
}
357370
else if (name[ip] == "total_psenergy")
358371
{
359-
pp.etotps = parse_double(val[ip]);
372+
pp.etotps = parse_double(val[ip],name[ip]);
360373
}
361374
else if (name[ip] == "wfc_cutoff")
362375
{
363-
pp.ecutwfc = parse_double(val[ip]);
376+
pp.ecutwfc = parse_double(val[ip],name[ip]);
364377
}
365378
else if (name[ip] == "rho_cutoff")
366379
{
367-
pp.ecutrho = parse_double(val[ip]);
380+
pp.ecutrho = parse_double(val[ip],name[ip]);
368381
}
369382
else if (name[ip] == "l_max")
370383
{
371-
pp.lmax = parse_int(val[ip]);
384+
pp.lmax = parse_int(val[ip],name[ip]);
372385
}
373386
else if (name[ip] == "l_max_rho")
374387
{
375-
this->lmax_rho = parse_int(val[ip]);
388+
this->lmax_rho = parse_int(val[ip],name[ip]);
376389
}
377390
else if (name[ip] == "l_local")
378391
{
379-
this->lloc = parse_int(val[ip]);
392+
this->lloc = parse_int(val[ip],name[ip]);
380393
}
381394
else if (name[ip] == "mesh_size")
382395
{
383-
pp.mesh = parse_int(val[ip]);
396+
pp.mesh = parse_int(val[ip],name[ip]);
384397
this->mesh_changed = false;
385398
if (pp.mesh % 2 == 0)
386399
{
@@ -390,11 +403,11 @@ void Pseudopot_upf::read_pseudo_upf201_header(std::ifstream& ifs, Atom_pseudo& p
390403
}
391404
else if (name[ip] == "number_of_wfc")
392405
{
393-
pp.nchi = parse_int(val[ip]);
406+
pp.nchi = parse_int(val[ip],name[ip]);
394407
}
395408
else if (name[ip] == "number_of_proj")
396409
{
397-
pp.nbeta = parse_int(val[ip]);
410+
pp.nbeta = parse_int(val[ip],name[ip]);
398411
}
399412
else
400413
{

0 commit comments

Comments
 (0)