以下のコードでは、
float引数を指定して「メソッド」を呼び出すと、自動的にキャストしintて必要なタスクを実行します。しかし、floatタイプをスローして即時に引数をcatch期待すると、機能しないのですか?intなぜ?catch別のことですが、ステートメントがない場合は、floatそれを一般的catchにcatch処理する必要がありますか?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"; }
3 に答える
このような例外は使用しないでください。例外は、通常のプログラム ロジックではなく、例外的な状況のためのものです。例外が悪用されるたびに、$DEITY は子猫を殺します。それをthrowすることによって。ピットに。火災の。そして悲しみ。
そうは言っても:
- 暗黙的な変換は、例外に対しては機能しません。参照:変換演算子の型によって例外をキャッチできますか?
- キャッチされない例外は、プログラムを終了します。したがって、再スローすると が呼び出され
terminate()、プログラムが停止します。
関数呼び出しはコンパイル時に解決され、コンパイラは型をチェックし、最も近い一致を見つけ (オーバーロードの解決)、適切な変換を行うことができます。実行時に例外が伝播されると、そのようなことは起こりません。catch例外は、型に正確に一致する 、または例外の明確なベースの 1 つによってキャッチされます。あなたの場合int、単純に a と一致しませんdouble。
2 番目の問題と同様に、あなたrethrowはブロックで囲まれていtryないため、最後のcatch(...). 最後catch(...)は最初のtryブロックに対応します。
単純変数は、いくつかのケースで他の単純型に変換できます。そのうちの 1 つは、メソッドを呼び出すためにそのような変換が必要かどうかです。それがあなたのケース1で起こっていることです-そしてそれはコンパイル中に起こっています.呼び出しは実行時に解決されません. そのような行為を禁止したい場合は、explicitキーワードを使用してください
ただし、引数の型が異なる 2 つのメソッドがある場合は、渡した引数に「最も近い」引数のメソッドが選択されます。型変換はスローには適用されません。スローされた型が catch の引数の型と一致する場合にのみ一致します。したがって、デフォルトのキャッチが機能します。
ところで:実際には float ではなく double 値を使用しています! 2.2f は float になります