以下のコードでは、
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 になります