我有些困惑用户如何能够区分我的函数可能抛出的异常。我的一个函数可以抛出两个 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
,当使用无效值构造它们时,它们会抛出自己的异常类型。 - user657267foo
只验证其参数吗? - dyphour > 23
吗?还是你想要25个不同的小时? - fredoverflowFoo
作为一个类。 - Shreyas