【发布时间】:2015-10-26 13:10:53
【问题描述】:
我无法完全理解用户将如何区分我的函数可能引发的异常。我的一个函数可以抛出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("..."));
}
}
注意:这是一个例子,请不要用有界整数回答。
假设用户调用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) {};
}
然后,抛出InvalidHour和InvalidMinute?
编辑:为每个可能的异常创建一个类对我来说似乎有点过分,尤其是在大型程序中。是否每个以这种方式有效使用异常的程序都附带有关于捕获什么的大量文档?
正如答案中提到的,我考虑过assert。环顾stackoverflow,我发现大多数人说你应该抛出异常(因为我的特殊情况是针对构造函数)。
看了很多关于何时使用异常的在线信息后,普遍的共识是使用assert 处理逻辑错误和异常处理运行时错误。虽然,使用无效参数调用 foo(int, int)可能是运行时错误。这就是我要解决的问题。
【问题讨论】:
-
理想情况下你应该有两种类型,
Hour和Minute,当使用无效值构造时它们会抛出它们自己的异常类型。 -
是的,你是对的,如果你想以一种简洁的方式区分它们,你应该引入新的类型
-
“用户如何区分我的函数可能抛出的异常” 为什么你需要用户/用户需要区分这两种情况?
foo是否只验证其参数? -
不应该是
hour > 23吗?还是您想要 25 个不同的可能时间? -
@fredoverflow:我认为在某些系统中,
24h00有效(24h30无效)。所以还有第三种情况,当两个参数的组合无效时。 (很难找到一个正确/明确/简单的名称)。
标签: c++ c++11 exception exception-handling