有四件事,两件大事,两件小事。一心一意...
1. 重新抛出使用无活动异常
语句用于throw;
重新抛出当前捕获的异常。例如:
try {
do_something();
} catch (const std::exception &) {
throw; // This statement re-throws an exception that was caught in this "catch" block.
}
在您的情况下,您正在使用throw;
而没有捕获任何异常(换句话说 - 它不会catch
直接或间接出现在块内),因此您的程序被终止。当需要抛出而不是重新抛出异常时,就像您的情况一样,您必须指定要抛出的异常对象。例如:
throw std::runtime_error("Something bad happened");
2. catch-all 子句不重新抛出捕获的异常
您的包罗万象的子句 ( catch (...)
) 是完全合法的 C++。但是,它不会重新抛出捕获的异常。即使它是合法的 C++ 代码,这种用法也是一种禁忌。C 和 C++ 运行时通常使用特殊类型的异常来实现某些功能。例如,NPTL正在使用异常来实现线程取消。如果您使用 捕获该异常catch (...)
,则不会取消线程,并且您将度过一段糟糕的时光。通常,您必须按类型捕获异常。在几乎所有情况下,异常都是从 继承的std::exception
,因此您必须编写catch (const std::exception &)
,或者,如果您希望捕获确切的类型,则 - catch(const TypeYouExpect &)
。但是,如果您必须使用 catch-all,请记住重新投掷。例如:
try {
do_something();
} catch (...) {
throw; // DO NOT FORGET TO RE-THROW.
}
3. 标题命名...
您包含 C 标头,而 C++ 为标准 C 功能提供自己的标头。所以,标题:
#include <stdio.h>
.. 应该:
#include <cstdio>
C++ 特定的 C 函数得到特殊处理。例如,它们在std
命名空间中可用。这样您就可以使用std::open()
而不是仅使用open()
or ::open()
。没什么大不了的,但强烈推荐去。
4. 从主返回。
与 C 不同,C++ 的main()
功能非常特殊。它让你没有return 0;
。这是默认行为。所以,除非你真的需要返回一些值,否则你可以通过不输入来节省一些时间return 0;
。但是请记住,这main
是唯一的函数,并且在其他任何地方都必须显式返回某些内容,除非函数被标记为void
。
希望能帮助到你。祝你好运!