C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

例外処理を示すC++プログラム


いくつかの深刻な複雑な数学演算を計算する関数があるとします。ただし、操作中にいくつかの例外が発生する可能性があります。発生する可能性のあるさまざまな種類の例外を処理し、次のことを実行する必要があります。

  • コンピュータが計算用のメモリを割り当てることができない場合は、「MemoryLow!」を出力する必要があります
  • 他のC++関連の例外が発生した場合は、「Exception:」を出力してから例外を出力する必要があります。
  • 何か他のことが起こった場合、「未処理の例外」を出力します。

値のペアを含む配列が与えられ、それを関数に渡します。例外が発生した場合はそれを処理し、それ以外の場合は出力値を出力します。

例外を生成する関数のメカニズムを無視して、例外を処理するだけで済みます。

したがって、入力がarr ={{361643035132、2297873642249}、{-17、15}};の場合、出力は-

になります。
Memory Low!
Exception: val1 is negative

値の最初のペアは大きすぎて処理できないため、「メモリ不足」が出力されます。 2番目のペアの最初の値は負です。提供されている関数はそれを処理できないため、例外「val1 isnegative」を生成/スローします、

これを解決するには、次の手順に従います-

  • iを初期化する場合:=0、i
  • val1:=values [i、0]
  • val2:=values [i、1]
  • 試してみてください
    • print(foo(val1、val2))
  • メモリを割り当てることができない場合(bad_alloc例外がキャッチされた場合)、
    • print( "Memory Low!")
  • それ以外の場合、他の標準C ++例外eがキャッチされた場合、
    • print( "例外:")
    • 例外の詳細を印刷する
  • それ以外の場合、他の例外がキャッチされた場合は、
    • print( "未処理の例外")

理解を深めるために、次の実装を見てみましょう-

#include <iostream>
#include <exception>
#include <string>
#include <stdexcept>
#include <vector>
#include <cmath>
using namespace std;

class Solution {
private:
   static int value;
public:
   static int foo(long long val1, long long val2) {
      value += 1;
      if(val1 < 0) {
         throw std::invalid_argument("val1 is negative");
      }
      vector<int> vectorList(val1, 0);
      int r = -1, c = sqrt(-1);
      if(val2 == 0) throw 0;
      r = (val1 / val2) * r;
      int ans = vectorList.at(val2);
      return r + val1 - val2 * ans;
   }
   static int getVal() {
      return value;
   }
};
int Solution::value = 0;

void solve(int t, long int values[][2]) {
   for (int i = 0; i < t; i++) {
      long long val1, val2;
      val1 = values[i][0];
      val2 = values[i][1];
      try {
         cout << Solution::foo(val1, val2) << '\n';
      }
      catch (const std::bad_alloc&) {
         cout << "Memory Low!\n";
      }
      catch (const std::exception& e) {
         cout << "Exception: " << e.what() << '\n';
      }
      catch (...) {
         cout << "Unhandled Exception\n";
      }
   }
}
int main() {
   long int arr[][2] = {{361643035132, 2297873642249}, {-17, 15}};
   solve(2, arr);
}

入力

long int arr[][2] = {{361643035132, 2297873642249}, {-17, 15}};
solve(2, arr);

出力

Memory Low!
Exception: val1 is negative

  1. C ++プログラムでの二分探索?

    二分探索は、半区間探索、対数探索、または二分探索とも呼ばれ、ソートされた配列内のターゲット値の位置を見つける検索アルゴリズムです。二分探索は、ターゲット値を配列の中央の要素と比較します。それらが等しくない場合、ターゲットが存在できない半分が削除され、残りの半分で検索が続行され、再び中央の要素がターゲット値と比較され、ターゲット値が見つかるまでこれが繰り返されます。残りの半分が空の状態で検索が終了した場合、ターゲットは配列に含まれていません。アイデアは単純ですが、バイナリ検索を正しく実装するには、特に配列の値が範囲内の整数のすべてではない場合、終了条件と中間点の計算に関する微妙な点に注意する必要

  2. C++での例外処理の基本

    C ++では、例外処理はランタイムエラーを処理するプロセスです。例外は、C++で実行時にスローされるイベントです。すべての例外は、std::exceptionクラスから派生します。処理可能なランタイムエラーです。例外を処理しない場合は、例外メッセージを出力してプログラムを終了します。 例外は、C ++標準では、プログラム内で使用できるクラスとして定義されています。親子クラス階層の配置を以下に示します。 C++の一般的な例外クラスは次のとおりです。 例外 説明 std ::exception これは、すべての標準C++例外の例外および親クラスです。 std ::