Shr*_*yas 5 c++ exception-handling exception c++11
我无法完全理解用户如何能够区分我的函数可以抛出的异常.我的一个函数可以抛出两个实例std::invalid_argument.
例如,在构造函数中:
#include <stdexcept> // std::invalid_argument
#include <string>
class Foo
{
public:
void Foo(int hour, int minute)
:h(hour), m(minute)
{
if(hour < 0 || hour > 23)
throw std::invalid_argument(std::string("..."));
if(minute < 0 || minute > 59)
throw std::invalid_argument(std::string("..."));
}
}
Run Code Online (Sandbox Code Playgroud)
注意:这是一个例子,请不要用有界整数回答.
假设用户调用foo(23, 62);,用户的异常处理程序如何区分两个可能的实例std::invalid_argument?
或者我做错了,我应该继承std :: invalid_argument来区分它们吗?那是,
class InvalidHour: public std::invalid_argument
{
public:
InvalidHour(const std::string& what_arg)
:std::invalid_argument(msg) {};
}
class InvalidMinute: public std::invalid_argument
{
public:
InvalidMinute(const std::string& what_arg)
:std::invalid_argument(msg) {};
}
Run Code Online (Sandbox Code Playgroud)
然后,扔InvalidHour和InvalidMinute?
编辑:为每个可能的异常创建一个类对我来说似乎有点太多了,特别是在大型程序中.是否每个以这种方式有效使用异常的程序都会附带有关捕获内容的大量文档?
如答案所述,我考虑assert过.看看stackoverflow,我发现大多数人都说你应该抛出异常(因为我的特殊情况是构造函数).
在查看了有关何时使用异常的大量在线信息之后,一般的共识是assert对运行时错误使用for逻辑错误和异常.虽然,foo(int, int)使用无效参数调用可能是运行时错误.这就是我想要解决的问题.
标准异常层次结构不适合逻辑错误。使用 anassert并完成它。如果您绝对希望将硬错误转化为更难以检测的运行时错误,那么请注意,处理程序只能做两件事:以某种可能不同的方式实现合同目标(可能只是重试操作),或者以某种方式实现合同目标。转抛出异常(通常只是重新抛出),并且原始异常的确切原因很少在 this 中扮演任何 r\xc3\xb4le 。最后,如果您确实想支持真正尝试各种参数组合的代码,直到找到一个不会抛出异常的组合,无论现在它是用文字写出来的,这看起来多么愚蠢,那么您必须std::system_error传递一个整数错误代码起来,但你可以定义派生异常类。
综上所述,去吧assert。
这就是它的用途。
\n