「マイコード以外」の「ユーザーにハンドルされていないとき」に関する設定は!?

Visual Studio 2005 の「例外ダイアログ」の問題なんだけど、これは ProductFeedback 行きか。
マイコードのみ」が有効の場合、「例外ダイアログ」には「スローされたとき」「ユーザにハンドルされていないとき」の2つのチェックボックスがあります。

try
{
  // user code...
  :
}
catch (IOException ex)
{
  // ....
  :
}

このようなコードの user code の部分で例外が発生した場合、

  • 「スローされたとき」が ON になっている場合は、スローされる直前に通った最後のユーザコードにおいてデバッガが停止。
  • 「ユーザにハンドルされていないとき」が ON になっている場合、この例では IOException がハンドルされているので、IOException 以外の例外が発生した場合には、スローされた直後に通る予定の最後のユーザコードにおいてデバッガが停止。

となります。この機能はプログラミングの学習過程や、アプリケーション構築の序盤〜中盤にかけて、非常に便利だと思います。

開発や学習が進んでいくと「マイコードのみ」の設定が ON のままでは予想できない挙動や、検出しにくい不具合に遭遇することがあります。そういうときは「マイコードのみ」の設定を OFF にすることで、ちょっと込み入った例外の動きをしることができるようになります。
ところが、この「マイコードのみ」の設定を OFF にすると、「例外ダイアログ」のチェックボックスが「スローされたとき」のみになります。では、「マイコードのみ」が OFF の場合に発生した「ハンドルされていない例外」「ハンドルされている例外」はどのように扱われるのでしょうか?

なんと、「マイコードのみ」が ON のときに指定した「ユーザにハンドルされていないとき」の設定が影響して挙動がかわります。

マイコードのみ」が ON の状態で「ユーザにハンドルされていないとき」を ON にして「マイコードのみ」を OFF に変更すると、『「非マイコード」でハンドルされた例外でデバッガが停止する』になり、「マイコードのみ」が ON の状態で「ユーザにハンドルされていないとき」を OFF にしてから「マイコードのみ」を OFF に変更すると、『「非マイコード」でハンドルされた例外でデバッガが停止しない』になります。わかりにくいですね、表にしてみましょう。

「ユーザに」の設定 マイコード内のハンドルされている例外 マイコード内のハンドルされていない例外
ハンドルされていないとき停止する 停止する 停止しない
ハンドルされていないとき停止しない 停止しない 停止しない

やっぱりわかりにくいかもしれない。繰り返しますが、この「ユーザにハンドルされていないとき」のチェックボックスは「マイコードのみ」を ON にしないとダイアログに出現しません。