0

ゼロによる除算が行われている特定の関数を呼び出す必要がある場合。呼び出された関数では何も変更できません。防ぐ唯一の方法は、関数の呼び出しに何らかの変更を加えることです。どうやってそれをしますか?

例:

//calling function

int func(5,1);

//called function

int func(int x,int y)
{
  y--;
 return(x/y); // here divide by zero will occur, but we cannot do any thing in 
              // called function
}

この例外の代わりにアプリケーションを実行し続ける方法は?

4

4 に答える 4

3

これを処理する方法は2つあります。

パラメータチェックを実施します。

呼び出し元のコードで、除数を確認する必要があります。

if(y != 0)
    func(x,y);
else
  //Some log or error handling

また

例外をスローします:

整数をゼロで割ったものは、標準のC++例外ではありません。したがって、暗黙的にスローされる例外に依存することはできません。特定のコンパイラーは、ゼロによる除算をある種の例外にマップする場合があります(これについては、コンパイラーのドキュメントを確認する必要があります)。その場合、その特定の例外をキャッチできます。ただし、これは移植可能な動作ではなく、すべてのコンパイラで機能するとは限らないことに注意してください。

したがって、上記の場合、最善の方法は、エラー条件(除数がゼロに等しい)を自分でチェックし、タイプの例外を明示的にスローすることですstd::runtime_error


どちらの場合も、コードは動作を適切に文書化する必要があります。最初の場合、コードは有効なサポートされている値を文書化する必要があり、2番目の場合はスローできる例外を指定する必要があります。

于 2012-05-14T06:05:45.353 に答える
1

Linux では、(signal(2) を使用して) SIGFPE 用のシグナル ハンドラー関数をインストールし、その中で例外をスローしてから、-fnon-call-exceptions を使用してコードをコンパイルできます。

それが完了すると、ゼロ除算により例外がスローされます。

Windows の場合、ここで言及されているものがいくつかあります:浮動小数点例外の処理

于 2012-05-14T06:19:41.373 に答える
0

一般的に、次のことができます。

  1. 関数を呼び出す前にパラメーターをチェックして、パラメーターが有効であることを確認してください。関数には、有効な入力範囲を指定するドキュメントが含まれている必要があります。
  2. 例外をキャッチします。(これはこの場合には適用されませんが、一般的にはオプションです)。
于 2012-05-14T06:05:29.487 に答える
0

呼び出し関数でこれを行うことができます:-

if(i == 0)
  cout<<" info::i is equal to zero";
else
  func(5,i);
于 2012-05-14T06:12:20.187 に答える