Std::stoul在C++失败后没有被抓住
Std::stoul not being catched after failing in C++
我是C++新手,可能错过了一些明显的东西。我想将 OCT 和十六进制数字转换为 DEC。我可以得到各种错误的输入,所以我想使用 std::stoul 进行转换,而不是很多条件,并在失败时捕获。
该方法的要点是在一个字符串中获取 3 个数字。第一个是在 OCT,第二个在 DEC,第三个在十六进制。我需要检查它们是否相同。
我从字符串的矢量 vec 中获取数字,但这工作正常,我认为问题不存在。
问题是,每当方法失败时(例如OCT的"88"),整个测试都会失败,并且不会进入catch块。
这是我的代码:
bool validate_line(const std::string& str) {
std::vector<std::string> vec;
std::string tmp;
for (int i = 0; i < str.size(); i++){
if(str.at(i) == ' '){
vec.push_back(tmp);
tmp = "";
}
else {
tmp += str.at(i);
if(i + 1 == str.size()) vec.push_back(tmp);
}
}
if(vec.size() != 3) return false;
//1 - Octan number
unsigned long octDec;
try {
octDec = std::stoul(vec.at(1), nullptr, 8);
}
catch(const std::invalid_argument& ia){
return false;
}
//2 - Decimal
int dec = atoi( vec.at(2).c_str() );
//3 - Hex number
std::string h = vec.at(3).c_str();
unsigned long hexDec;
try{
hexDec = std::stoul(h, nullptr, 16);
}
catch(const std::invalid_argument& ia) {
return false;
}
if(octDec == dec && dec == hexDec) return true;
return false;
}
这些是我对此方法的测试示例。第一个还可以。其余的应该以捕获块结束。
TEST_CASE("Line validation", "[small1]") {
GIVEN("complex improperly tagged equal string") {
CHECK(validate_line("0111 73 0x49"));
}
GIVEN("string not conforming to format -- bad number format") {
CHECK(!validate_line("88 88 0x58"));
}
GIVEN("string not conforming to format -- not numbers") {
CHECK(!validate_line("07 7 G"));
}
}
您的代码始终在以下行返回:
if(vec.size() != 4) return false;
所以可以抛出的函数永远不会被调用。
此时,所有测试输入的vec.size()
始终为 3。
更新:
OP 将有问题的代码行更改为
if(vec.size() != 3) return false;
在此答案已经发布之后。
问题确实出在编译器上。我使用 CLion,在调试时,如果只有一个 return 语句,它不会显示进入 catch 块的步骤。代码确实没有任何问题。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- Std::stoul在C++失败后没有被抓住