2
  • 以下のコードでは、float引数を指定して「メソッド」を呼び出すと、自動的にキャストしintて必要なタスクを実行します。しかし、floatタイプをスローして即時に引数をcatch期待すると、機能しないのですか? intなぜ?

  • catch別のことですが、ステートメントがない場合は、floatそれを一般的catchcatch処理する必要がありますか?

    int method(int i)
    {
        return i--;
    }
    void main()
    {
        try {
            cout<<method(3.14);
            throw string("4");
        }
        catch(string& s){
            try{
                cout << s;
                throw 2.2;
            }
            catch(int i)
                cout<<i;
    
            catch(...)
                throw;
    
            cout<<"s"+s;
        }
        catch(...)
            cout<<"all";
    }
    
4

3 に答える 3

2

このような例外は使用しないでください。例外は、通常のプログラム ロジックではなく、例外的な状況のためのものです。例外が悪用されるたびに、$DEITY は子猫を殺します。それをthrowすることによって。ピットに。火災の。そして悲しみ。


そうは言っても:

于 2013-01-30T07:36:12.237 に答える
2

関数呼び出しはコンパイル時に解決され、コンパイラは型をチェックし、最も近い一致を見つけ (オーバーロードの解決)、適切な変換を行うことができます。実行時に例外が伝播されると、そのようなことは起こりません。catch例外は、型に正確に一致する 、または例外の明確なベースの 1 つによってキャッチされます。あなたの場合int、単純に a と一致しませんdouble

2 番目の問題と同様に、あなたrethrowはブロックで囲まれていtryないため、最後のcatch(...). 最後catch(...)は最初のtryブロックに対応します。

于 2013-01-30T07:36:23.760 に答える
1

単純変数は、いくつかのケースで他の単純型に変換できます。そのうちの 1 つは、メソッドを呼び出すためにそのような変換が必要かどうかです。それがあなたのケース1で起こっていることです-そしてそれはコンパイル中に起こっています.呼び出しは実行時に解決されません. そのような行為を禁止したい場合は、explicitキーワードを使用してください

ただし、引数の型が異なる 2 つのメソッドがある場合は、渡した引数に「最も近い」引数のメソッドが選択されます。型変換はスローには適用されません。スローされた型が catch の引数の型と一致する場合にのみ一致します。したがって、デフォルトのキャッチが機能します。

ところで:実際には float ではなく double 値を使用しています! 2.2f は float になります

于 2013-01-30T07:39:41.300 に答える