具有无效输入异常处理的构造函数 C++

Constructor with exception handling for invalid input c++

我正在尝试创建一个构造函数来验证输入并在输入无效时抛出异常。

假设我有一个构造函数,它只接受 mod 12 中的值作为 int a,mod16 的值作为 b,以及大于 0 的值作为 c。我正在尝试使用 std::invalid_argument。我将如何实现异常处理程序?这会抛出异常吗?如果输入的值超出范围?

Mod(int a, int b, int c) {
   try {
       if (a > 11 || a < 0 || b > 15 || b < 0 || c < 0) {
           throw std::invalid_argument("Invalid Argument");
       }
   } catch (std::invalid_argument const& value) {
       std::cerr << "Invalid Argument " << value.what() << '\n';
   }
}

Would this throw an exception?

是的,但随后您捕获了异常,因此构造函数将 return 成功。

如果你的目标是抛出构造函数,那么不要在构造函数中捕获异常。

How would I implement the exception handler?

您将在要处理异常的范围内实现异常处理程序。您无法在要抛出异常的范围内处理异常。

How would I implement the exception handler?

通过不在抛出的构造函数中实现它。在试图将无效输入传递给构造函数的代码中实现它,例如:

Mod(int a, int b, int c){
   if (a > 11 || a < 0 || b > 15 || b < 0 || c < 0 ) {
      throw std::invalid_argument("Invalid Argument");
   }
}
try {
   Mod m(1, 2, -1);
   // use m as needed...
}
catch (std::invalid_argument const& value) {
    std::cerr << "Invalid Argument " << value.what() << '\n';
}

Would this throw an exception? If the values entered were out of bound?

是的,确实如此,但是它会立即捕获并丢弃异常,因此调用者永远不会看到它。它也可能从未被抛出。