none
例外(エラー)の発生した場所 RRS feed

  • 質問

  • お世話になります。

    ちょっと抽象的な質問になってしまうのですが、VS2008で開発しているときにいつも思っていることです。

    ビルド済みのEXEを実行したあと、いわゆる「実行時エラー」が出た場合、例外が発生した旨のメッセージがでます。
    そこで「詳細情報」をみることもできるのですが、よくわかりません。
    具体的に、どのモジュール(クラス)の何行目が間違っているのか、知りたいのですがそのような方法はあるのでしょうか?

    (ちなみに例外はできるだけtry-catch-end try するのは心得ている「つもり」です)


    2009年11月16日 13:41

回答

  • メソッドの呼び出し履歴が、例外オブジェクトの StackTrace プロパティに格納されています。
    例えば Hoge.A メソッドの中で呼び出している Huga.B メソッドの中で呼び出している PiyoC メソッドで例外が投げられた場合、
    場所 Piyo.C 場所 c:\*******\*******\Piyo.cs:行**
    場所 Huga.B 場所 c:\*******\*******\Huga.cs:行**
    場所 Hoge.A 場所 c:\*******\*******\Hoge.cs:行**
    といった風になります。
    まずスタックトレース先頭に現れているソースファイルの行を調べるのがいいでしょう。
    2009年11月16日 14:01

すべての返信

  • メソッドの呼び出し履歴が、例外オブジェクトの StackTrace プロパティに格納されています。
    例えば Hoge.A メソッドの中で呼び出している Huga.B メソッドの中で呼び出している PiyoC メソッドで例外が投げられた場合、
    場所 Piyo.C 場所 c:\*******\*******\Piyo.cs:行**
    場所 Huga.B 場所 c:\*******\*******\Huga.cs:行**
    場所 Hoge.A 場所 c:\*******\*******\Hoge.cs:行**
    といった風になります。
    まずスタックトレース先頭に現れているソースファイルの行を調べるのがいいでしょう。
    2009年11月16日 14:01
  • 念のための確認ですが、.NET アプリケーションという前提で問題ないのでしょうか?


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2009年11月16日 14:28
    モデレータ
  • 念のための確認ですが、.NET アプリケーションという前提で問題ないのでしょうか?


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    はい。VB.NETです。
    ありがとうございます。
    2009年11月17日 4:18
  • ありがとうございます。
    ご教示いただいた方法でやってみます。
    2009年11月17日 4:19
  • (ちなみに例外はできるだけtry-catch-end try するのは心得ている「つもり」です)

    いえ、キャッチする必要がある物だけ、キャッチする必要があるところで、キャッチしてください。「キーパー以外がキャッチすると反則です」(by NAL-6295さん)。キーパーであっても、ペナルティエリア外でキャッチすると反則です。

    .NET Framework の範囲で心得ておくべきは、「予期される例外は、実行時に発生しないようにしておく」です。


    Jitta@わんくま同盟
    2009年11月18日 14:08
  • (ちなみに例外はできるだけtry-catch-end try するのは心得ている「つもり」です)

    いえ、キャッチする必要がある物だけ、キャッチする必要があるところで、キャッチしてください。「キーパー以外がキャッチすると反則です」(by NAL-6295さん)。キーパーであっても、ペナルティエリア外でキャッチすると反則です。

    .NET Framework の範囲で心得ておくべきは、「予期される例外は、実行時に発生しないようにしておく」です。


    Jitta@わんくま同盟

    ご返信ありがとうございます。

    >.NET Framework の範囲で心得ておくべきは、「予期される例外は、実行時に発生しないようにしておく」です。

    この「心得」は今後十分意識してまいりますが、本件は「予想されない例外」の場合です。


    2009年11月26日 1:32
  •  予想されない例外なら、キャッチする必要はありません。何を思って「(ちなみに例外はできるだけtry-catch-end try するのは心得ている「つもり」です)」と、書き足したのでしょうか?こう書き足してあるから、「至る所で必要もないのにキャッチしているのでは?」と考えたのですが。。。

    ところで、予期しない例外であるということならば。StackTrace にコードの場所が出るのは、.pdb ファイルがあるときです。納品するときには .pdb ファイルは納品しないと思います。そうすると、コードの場所(ファイル名と行番号)はわかりません。Debug でも Release でも、.pdb ファイルを消してやってみて下さい(かならず通るところに「Throw New Exception("TEST")」と入れておけばいいでしょう)。それは、当初の問題をクリアしていますか?


    追加

    予想しない例外ならば、コードの場所よりも、「どんな状況で例外が発生したか」の方が、原因究明に役立つと思います。そのあたりは、どのようにお考えでしょうか。


    Jitta@わんくま同盟
    2009年11月27日 14:14