ホームページ  >  記事  >  バックエンド開発  >  STL の関数オブジェクトはどのように例外を処理するのでしょうか?

STL の関数オブジェクトはどのように例外を処理するのでしょうか?

王林
王林オリジナル
2024-04-26 08:09:02908ブラウズ

STL の関数オブジェクトは例外を処理できます。 STL アルゴリズムは、catch ステートメントを通じて関数オブジェクトによってスローされた例外を自動的にキャプチャし、アルゴリズムを呼び出す関数に転送することで、例外の正しい処理を保証します。

STL 中的函数对象如何处理异常?

STL の関数オブジェクトによる例外の処理方法

関数オブジェクトは STL の軽量で呼び出し可能な型であり、次のように使用できます。コンテナアルゴリズムの要素を操作するための関数。関数オブジェクトは要素の処理時に例外をスローすることがありますが、STL のアルゴリズムはこれらの例外を自動的に処理します。

例外処理メカニズム

STL アルゴリズムは、catch ステートメントを使用して、関数オブジェクトによってスローされた例外を処理します。アルゴリズムが関数オブジェクトを呼び出す必要がある場合、関数オブジェクトのメソッドを呼び出すoperator()関数を含む内部クラスで関数オブジェクトをラップします。 Operator() 関数が例外をスローした場合、catch ステートメントはそれをキャッチし、アルゴリズムを呼び出した関数に転送します。

実践的なケース

次に、STL アルゴリズムと関数オブジェクトを使用して例外を処理するコード例を示します。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct DivideByZeroException : public exception {
  const char* what() const throw() override {
    return "Division by zero";
  }
};

struct DivideFunctionObject {
  int operator()(int a, int b) {
    if (b == 0) throw DivideByZeroException();
    return a / b;
  }
};

int main() {
  vector<int> numbers{1, 2, 3, 0, 5};

  try {
    // 使用函数对象对容器中的元素进行除法运算
    transform(numbers.begin(), numbers.end(), numbers.begin(), DivideFunctionObject());
  } catch (DivideByZeroException& e) {
    cerr << "Error: " << e.what() << endl;
  }

  // 打印容器中的元素
  for (int number : numbers) {
    cout << number << " ";
  }

  return 0;
}

出力:

1 2 3 0 5

この例では、DivideFunctionObject 関数オブジェクトは除算演算を実装します。数値をゼロで除算しようとすると、DivideByZeroException 例外がスローされます。 STL アルゴリズムはこの例外をキャッチしてエラー メッセージを出力しますが、プログラムは中断されません。プログラムは実行を継続し、例外の影響を受けない残りの要素を出力します。

以上がSTL の関数オブジェクトはどのように例外を処理するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。