gpt4 book ai didi

c++ - 区分同一类型的多个异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:23 25 4
gpt4 key购买 nike

我不太清楚用户将如何区分我的函数可能抛出的异常。我的一个函数可以抛出 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) {};
}

然后,抛出 InvalidHourInvalidMinute

编辑: 为每个可能的异常创建一个类对我来说似乎有点太多了,尤其是在大型程序中。是否每个以这种方式有效使用异常的程序都附带了有关捕获内容的大量文档?

如回答中所述,我考虑过 assert到。环顾 stackoverflow,我发现大多数人都说你应该抛出异常(因为我的特殊情况是针对 constructor)。

在查阅了大量有关何时使用异常的在线信息后,普遍的共识是使用 assert对于运行时错误的逻辑错误和异常。虽然,打电话foo(int, int)参数无效可能是运行时错误。这就是我要解决的问题。

最佳答案

标准异常层次结构不适用于逻辑错误。使用 assert 并完成它。如果你真的想将硬错误转化为更难检测的运行时错误,那么请注意处理程序只能做两件合理的事情:以某种可能不同的方式实现契约(Contract)目标(可能只是重试操作),或者在turn throw an exception(通常只是重新抛出),并且原始异常的确切原因很少在这方面发挥任何作用。最后,如果你确实想要支持真正尝试各种参数组合直到找到一个不抛出的代码,不管它现在看起来多么愚蠢,因为它是用文字写出来的,好吧,你有 std::system_error 用于向上传递整数错误代码,但您可以定义派生的异常类。

综上所述,请使用断言

这就是它的用途。

关于c++ - 区分同一类型的多个异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31804048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com