none
x64アプリケーションのデバッグにてtry~catchを意図的に発生させる方法 RRS feed

  • 質問

  • VS2012 C# にて質問です。

    デバッグ中にcatch文の試験を行ないたいのですが、ブレークポイントをD&Dで移動させることや、x64ではエディットコンティニューが使えないのでどうすれば良いか困っています。

    方法としては #if(_DEBUG){ throw new Exception();} #endif の様にデバッグ用のソースを組み込む以外方法はないでしょうか?

    よろしくお願いします。

    2014年9月25日 15:36

回答

  • x64 でエディットコンティニューを使いたいということであれば、VS2013 以上を使っていただければ良いと思います。

    それ以外となると、普段実行条件を満たさないような if ブロックを埋めておいて、実行中の行をそこに無理矢理持って行くぐらいでしょうか?

    • 回答としてマーク mogja 2014年9月28日 11:42
    2014年9月25日 15:48
    モデレータ
  • どうも目的がつかめませんが、「try-catchを意図的に発生させる」のではなく、「デバッグセッション実行中に特定のtryブロック内において、例外を任意のタイミングでスローさせたい」ということではないですか? しかしいったいなぜそのために「ブレークポイントのドラッグ&ドロップ」やエディットコンティニュが必要なのか(どうやって使おうとしているのか)不明ですが……

    ちなみに「ブレークポイント」ではなく「現在のステートメント」であればx86/x64ともにデバッグセッション中にドラッグ&ドロップで移動できるはずですが、移動させたいのは本当に「ブレークポイント」のほうですか?

    下記のようなメソッドの呼び出しコードを、tryブロック内の適当な箇所に仕込んでおいて、あとはif文が記述されている行にブレークポイントを置き、実行時にthrowsパラメータの値をデバッガーでtrueに変更すれば(もしくは現在のステートメントをifブロック内に移動すれば)例外がスローされる、ということは実現できるのではないでしょうか。メソッド内部では例外を処理していないので、呼び出し元に伝播します。また、このメソッドはConditional属性により、デバッグビルドでのみ有効になり、リリースビルドでは呼び出し自体が除去されます。

    [System.Diagnostics.Conditional("DEBUG")]
    private static void ThrowExceptionIfDebugAnd(bool throws = false)
    {
    	if (throws)
    	{
    		throw new Exception("Intentional exception.");
    	}
    }
    いずれにせよ、質問するときは実現したいことをもっと正確に分かりやすく伝える努力をしましょう。
    • 編集済み sygh 2014年9月26日 16:45
    • 回答としてマーク mogja 2014年9月28日 11:42
    2014年9月26日 16:28

すべての返信

  • x64 でエディットコンティニューを使いたいということであれば、VS2013 以上を使っていただければ良いと思います。

    それ以外となると、普段実行条件を満たさないような if ブロックを埋めておいて、実行中の行をそこに無理矢理持って行くぐらいでしょうか?

    • 回答としてマーク mogja 2014年9月28日 11:42
    2014年9月25日 15:48
    モデレータ
  • どうも目的がつかめませんが、「try-catchを意図的に発生させる」のではなく、「デバッグセッション実行中に特定のtryブロック内において、例外を任意のタイミングでスローさせたい」ということではないですか? しかしいったいなぜそのために「ブレークポイントのドラッグ&ドロップ」やエディットコンティニュが必要なのか(どうやって使おうとしているのか)不明ですが……

    ちなみに「ブレークポイント」ではなく「現在のステートメント」であればx86/x64ともにデバッグセッション中にドラッグ&ドロップで移動できるはずですが、移動させたいのは本当に「ブレークポイント」のほうですか?

    下記のようなメソッドの呼び出しコードを、tryブロック内の適当な箇所に仕込んでおいて、あとはif文が記述されている行にブレークポイントを置き、実行時にthrowsパラメータの値をデバッガーでtrueに変更すれば(もしくは現在のステートメントをifブロック内に移動すれば)例外がスローされる、ということは実現できるのではないでしょうか。メソッド内部では例外を処理していないので、呼び出し元に伝播します。また、このメソッドはConditional属性により、デバッグビルドでのみ有効になり、リリースビルドでは呼び出し自体が除去されます。

    [System.Diagnostics.Conditional("DEBUG")]
    private static void ThrowExceptionIfDebugAnd(bool throws = false)
    {
    	if (throws)
    	{
    		throw new Exception("Intentional exception.");
    	}
    }
    いずれにせよ、質問するときは実現したいことをもっと正確に分かりやすく伝える努力をしましょう。
    • 編集済み sygh 2014年9月26日 16:45
    • 回答としてマーク mogja 2014年9月28日 11:42
    2014年9月26日 16:28