gpt4 book ai didi

C++从代码中的不同位置抛出相同的错误消息

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:51 24 4
gpt4 key购买 nike

我想从不同的地方抛出同样的错误。这是一个例子:

int devide(int a,int b)
{
if(b==0) {
throw "b must be different from 0";
}

return 0;
}

int mod(int a,int b)
{
if(b==0) {
throw "b must be different than 0";
}

return 0;
}

在主函数中:

int main()
{
try {
devide(1,0);
} catch(char const* e) {
cout << e << endl;
}
try {
mod(1,0);
} catch(char const* e) {
cout << e << endl;
}

return 0;
}

现在程序的输出是:

b must be different from 0
b must be different than 0

如您所见,错误本质上是相同的,但错误消息不同。那么在这种情况下我可以遵循的最佳实践是什么,以便它可以扩展?假设我有 100 种不同类型的异常,但是当我为 devisor 不同于 0 抛出异常时,我希望在抛出异常的所有地方都得到相同的消息。

编辑:我在考虑两种选择:

  1. 对于我可能抛出的每个异常,我都将定义我自己的类,该类将继承 std::exception。我可以将每个异常放入 Exceptions.cpp
  2. 我可以定义一个将继承 std::exceptionclass MyException 并且在构造函数中我将请求一个错误字符串。而且我可以在某个地方(我仍然想不出将它们放在哪里)定义将描述消息的静态字符串常量。例如,如果我已经定义了 MyException,我可以像这样使用它:

    int devide(int a,int b)
    {
    if(b==0) {
    throw new MyException(MyException::DEVISION_BY_ZERO);
    }
    }

其中 MyException::DEVISION_BY_ZERO 将是一个字符串常量。

我认为第二种方法需要较少的编码,但对我来说并不是很漂亮。

那么有没有比上面两种更好的方法呢?

最佳答案

将原始类型作为异常抛出不是一个好主意。最好的方法是使用 std::runtime_error ,这是针对这种情况的。

如果您想区分 catch() block 中的错误,您可以从该异常派生并使用特定文本进行初始化:

class DivByZeroError : public std::runtime_error {
public:
DivByZeroError() : std::runtime_error("divisor must be different from 0") {}
// Alternate constructor to provide a specific error message
DivByZeroError(const std::string& s) : std::runtime_error(s) {}
}

class ModWithZeroError : public std::runtime_error {
public:
ModWithZeroError () : std::runtime_error("divisor must be different than 0") {}
ModWithZeroError (const std::string& s) : std::runtime_error(s) {}
}

int main()
{
try {
devide(1,0);
mod(1,0);
} catch(const DivByZeroError& e) {
cout << e.what() << endl;
} catch(const ModWithZeroError & e) {
cout << e.what() << endl;
} catch(const std::exception & e) { // Any other exceptions
cout << e.what() << endl;
}

return 0;
}

正如@CaptainOblivious 在他们的评论中提到的,还有 std::invalid_argument您可以继承自,如果参数名称只是错误消息中唯一要更改的内容。

关于C++从代码中的不同位置抛出相同的错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39639863/

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