DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33546 / inTopicNo.1)  あらゆる例外がTargetInvocationExceptionで出力される。
  
□投稿者/ Whatom 一般人(4回)-(2017/01/08(Sun) 23:29:59)
  • アイコン環境/言語:[Windows 10 Home 64bit、VS2015 Community Edition,、C#、.NET Framework4.5] 
    分類:[.NET] 

    Visual studio 2015でC#のプログラムを作成している者です。
    最近、プログラムのデバッグ中にTargetInvocationExceptionが頻発して困っています。

    詳しく調べてみるとIndexOutofRangeExceptionやNullPointerExceptionとして表示されるべき例外が全てTargetInvocationExceptionとして処理されて、Program.csのApplication.Run()の部分で止まっています。

    エラーの発生元は「await Task.Run<型>(()=> hoge())」で呼び出される関数内で発生していますが、この部分を単に「hoge()」とマルチスレッドを用いずに書き直しても同様の現象が発生します。
    ワーカースレッドに切り替えても「アプリケーションはブレークモードになっています」と表示されるのみで、呼出履歴も確認できません。

    またデバッグモードをDebug/Releaseに切り替えても、プラットフォームをx86やAny CPUに切り替えても状況は同じです。

    エラーの発生元を特定するのに時間がかかり、困っております。
    状況が分かりにくく申し訳ありませんが、どなたかご助言頂けないでしょうか。
引用返信 削除キー/
■33547 / inTopicNo.2)  Re[1]: あらゆる例外がTargetInvocationExceptionで出力される。
□投稿者/ Hongliang 大御所(528回)-(2017/01/10(Tue) 11:35:54)
  • アイコン例外のスタックトレースはどうなっていますか?
引用返信 削除キー/
■33548 / inTopicNo.3)  Re[2]: あらゆる例外がTargetInvocationExceptionで出力される。
□投稿者/ Whatom 一般人(5回)-(2017/01/10(Tue) 21:42:08)
  • アイコンご返信有難うございます。

    スタックトレースとは、呼出履歴のウィンドウのことでしょうか。
    ワーカースレッドに切り替えても、その画面には何も表示されていませんでした。
引用返信 削除キー/
■33549 / inTopicNo.4)  Re[3]: あらゆる例外がTargetInvocationExceptionで出力される。
□投稿者/ Hongliang 大御所(529回)-(2017/01/10(Tue) 21:49:18)
  • アイコン> スタックトレースとは、呼出履歴のウィンドウのことでしょうか。
    いえ、例外オブジェクトのStackTraceプロパティです。
    未処理の例外が発生してデバッガが自動的にブレイクした時、「ローカル」ウィンドウにて$exception変数として例外オブジェクトを確認できるかと思います。
引用返信 削除キー/
■33553 / inTopicNo.5)  Re[1]: あらゆる例外がTargetInvocationExceptionで出力される。
□投稿者/ 魔界の仮面弁士 大御所(1060回)-(2017/01/12(Thu) 10:20:35)
  • アイコンNo33546に返信(Whatomさんの記事)
    > プログラムのデバッグ中にTargetInvocationExceptionが頻発して困っています。

    データバインド、あるいはリフレクションを利用している箇所は無いでしょうか。

    たとえば下記は、Form2 コンストラクタにて DivideByZeroException を
    わざと throw させているコードですが、これを実行した場合、
     Form1.button1 クリック時 → Form2 コンストラクタで DivideByZeroException
     Form1.button2 クリック時 → button2_Click で TargetInvocationException
    という、異なった結果を生じさせます。


    public partial class Form1 : Form
    {
      public Form1()
      {
        InitializeComponent();
      }

      private void button1_Click(object sender, EventArgs e)
      {
        var f = new Form2();
        f.Show(this);
      }

      private void button2_Click(object sender, EventArgs e)
      {
        var t = Type.GetType("WindowsFormsApplication1.Form2");
        var f = (Form)Activator.CreateInstance(t);
        f.Show(this);
      }
    }


    public partial class Form2 : Form
    {
      public Form2()
      {
        InitializeComponent();
        this.Text = (123 / int.Parse("0")).ToString(); // ゼロ除算例外
      }
    }


    ただし、TargetInvocationException で停止した場合でも、
    デバッガの例外通知画面の左下にある、アクション:詳細の表示... のリンクで
    例外内容を見てみると、TargetInvocationException の
    InnerException プロパティには DivideByZeroException が格納されます。

    また、そのInnerException の StackTrace プロパティを見れば、
    Form2 のコンストラクタで発生したものであることが読み取れます。
    (TargetInvocationException の StackTrace のことではなく、
     TargetInvocationException.InnerException.StackTrace のことです)
引用返信 削除キー/
■33557 / inTopicNo.6)  Re[2]: あらゆる例外がTargetInvocationExceptionで出力される。
□投稿者/ Whatom 一般人(6回)-(2017/01/14(Sat) 17:54:09)
  • アイコンHongliang様、魔界の仮面弁士様

    返答が遅れてしまい申し訳ありませんでした。
    ご指導有難うございます。
    InnerExceptionの中のStackTraceにエラーの発生箇所が記録されていました。
    これでプログラミングが捗ります。
解決み!
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -