diff --git a/include/yaml-cpp/node/impl.h b/include/yaml-cpp/node/impl.h index 150a6cf..f5d622b 100644 --- a/include/yaml-cpp/node/impl.h +++ b/include/yaml-cpp/node/impl.h @@ -124,8 +124,8 @@ struct as_if { const Node& node; T operator()() const { - if (!node.m_pNode) - throw TypedBadConversion(node.Mark()); + if (!node.m_pNode) // no fallback + throw InvalidNode(node.m_invalidKey); T t; if (convert::decode(node, t)) @@ -140,6 +140,8 @@ struct as_if { const Node& node; std::string operator()() const { + if (node.Type() == NodeType::Undefined) // no fallback + throw InvalidNode(node.m_invalidKey); if (node.Type() == NodeType::Null) return "null"; if (node.Type() != NodeType::Scalar) diff --git a/test/node/node_test.cpp b/test/node/node_test.cpp index b444455..a9c47b7 100644 --- a/test/node/node_test.cpp +++ b/test/node/node_test.cpp @@ -191,6 +191,14 @@ TEST(NodeTest, MapElementRemoval) { EXPECT_TRUE(!node["foo"]); } +TEST(NodeTest, MissingKey) { + Node node; + node["foo"] = "value"; + EXPECT_TRUE(!node["bar"]); + EXPECT_EQ(NodeType::Undefined, node["bar"].Type()); + EXPECT_THROW(node["bar"].as(), InvalidNode); +} + TEST(NodeTest, MapIntegerElementRemoval) { Node node; node[1] = "hello";