有些函数应该是非抛出异常的,但标准没有提及。例如,关联式容器中的
erase(q)
(其中q
表示一个有效的可以解引用的常量迭代器)。根据[res.on.exception.handling#4],这允许实现抛出任何标准异常:
如果你想要吞咽它们抛出的任何实现定义的异常,你必须使用try-catch块。在C++标准库中定义了没有Throws段落但具有潜在抛出异常规范的函数可能会抛出实现定义的异常。 170实现应通过抛出标准异常类([bad.alloc],[support.exception],[std.exceptions])或派生自它们的异常来报告错误。
std::set<int> s{1};
try
{
s.erase(s.cbegin());
}
catch (...) {}
这很丑陋且效率低下,但却是必要的。因此我也不知道它有什么好处。
try
中并非解决方法。 - StoryTeller - Unslander Monica