ウィンドウハンドルを作成する前に、例外のキャプチャをインターフェイスします。コントロールでInvokeまたはBeginInvokeを呼び出すことはできません。

@惑惑Dong
がプロジェクトで問題が発生したため、ウィンドウハンドルを作成する前に、コントロールでInvokeまたはBeginInvokeを呼び出すことはできません。プロジェクトのプロセスでは、Visual Studioでデバッグするときに、プログラムが操作中にこのエラーを頻繁に発生し、インターフェイス全体が異常になります。また、エラー時間が不規則で、数日間エラーがない場合や、エラーが頻繁に報告される場合があります。また、このインターフェイスが実行されている場合、CPUリソースの90%以上を占有するため、インターフェイスがスタックすることがあります。
プログラマーは「私はあなたを愛しています」とよく言いますが、話すのに3秒、説明に3時間、証明するのに一生かかります。「バグ」という3文字は、検索に3秒、検索に3時間かかりますが、デバッグには一生かかります。「上級プログラマーでもバグを書くでしょうが、バグはひどいものではありません。重要なことは、バグが発生したときにバグをすばやく見つけることです。
ここに画像の説明を挿入
兄弟に問題の解決策を尋ねるよう依頼してください。
最初に、私はメインインターフェイススレッドにいて、関連していますメソッドで{} catch {}を試してみてください{} exception catchがコードに追加されましたが、機能しませんでした。インターフェースが何もせず、何も実行しないことが判明したため、割り込みが発生して例外がスローされるため、次の方法を試しました。

1.プログラムの入り口に大まかに例外キャッチを追加します

この例外キャッチメソッドをコードメソッドに追加して、エラーの場所をキャッチします。

try
{

}
catch (Exception ex)
{
   MessageBox.Show("位置:" + "[" + ex.Source + "]" +  "\r\n" + ex.StackTrace +  "\r\n" 
                   + "信息:" + "[" + ex.GetType() + "]" + ex.Message, "ExceptionInfo");
}
//说明
//ex.Source      获取导致错误的应用对象的名称
//ex.StackTrace  异常堆栈,获取调用堆栈上的字符串表示形式
//ex.GetType()     获取错误的类型

ここに画像の説明を挿入
エラーをキャッチします。
場所:[セパレータ] xxxx内
エラーの場所の詳細情報(プロジェクト、ディレクトリ、.csコード、および行番号)を表示します(エラーを報告した関数の場所にあります)
情報:エラーの種類を取得し、中国語のエラーを表示します

2.グローバル例外キャプチャー、プログラム全体の例外をキャプチャーします

プログラムプログラムの入り口でtry ... Catchを設定します。catch例外
は、Throwコマンドによってスローされ、スローされたモジュールからずっとスローされます。途中でtry ... catch ...によってキャッチされなかった場合は、CLR(共通言語ランタイム)。スタックを使用してこのプロセスを説明する場合、それは、try ... catch ...によってキャッチされるまで、またはスタックの下部に沈んでCLRによってキャッチされるまで、例外がスタックの最上部からずっと沈むということです。例外を受け取った後のCLRの処理は非常に単純であり、失礼に直接エラーを報告してから、プログラムを閉じます。

try
{
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   Application.Run(new Form1());
}
catch (Exception ex)
{
   MessageBox.Show("位置:" + "[" + ex.Source + "]" +  "\r\n" + ex.StackTrace +  "\r\n"
                   + "信息:" + "[" + ex.GetType() + "]" + ex.Message, "ExceptionInfo");
}

グローバル例外をキャプチャします。プログラム全体の例外は、1つずつ追加せずに一度にキャッチされます。このメソッドも、子スレッドの例外をキャッチできるかどうかはわかりません

3.イベント監視Application.ThreadException

Applicationクラスは、Applicationクラスのイベントを使用して、Windowsプログラム全体の動作を制御します。

static void Main()
{
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandleException);
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
private static void CurrentDomain_UnhandleException(object sender,UnhandledExceptionEventArgs e)
{
    Exception ex = e.Exception;
    MessageBox.Show(string.Format("捕获到未处理异常:{0}\r\n异常信息:{1}\r\n异常堆栈:{2}", ex.GetType(), ex.Message, ex.StackTrace));
}

結果:失敗

4.サブスレッドの例外がAppDomain.CurrentDomain.UnhandledExceptionをキャッチしました

Application.ThreadExceptionイベントをリッスンすることでプログラムの例外をキャプチャできますが、このApplication.ThreadExceptionイベントは、プログラムのメインスレッドで発生する例外のみをキャプチャできます。マルチスレッドを使用していて、子スレッドで例外が発生した場合、Application.ThreadExceptionイベントはトリガーされません。子スレッドの例外をリッスンする場合は、別のイベントを登録する必要があります:AppDomain.CurrentDomain.UnhandledExceptionこのイベントは、現在のプログラムドメインで未処理の例外が発生した場合にのみ発生します(application.ThreadExceptionイベントがない場合、メインスレッドの例外は最終的にこのイベントもトリガーします)

static class Program
{
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main()
    {
        //处理UI线程异常
        Application.ThreadException += Application_ThreadException;
        //处理非UI线程异常
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        //应用程序的主入口点
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new FrmMain());
    }
     
    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Exception ex = e.ExceptionObject as Exception;
        MessageBox.Show(string.Format("捕获到未处理异常:{0}\r\n异常信息:{1}\r\n异常堆栈:{2}\r\nCLR即将退出:{3}", ex.GetType(), ex.Message, ex.StackTrace, e.IsTerminating));
    }
     
    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        Exception ex = e.Exception;
        MessageBox.Show(string.Format("捕获到未处理异常:{0}\r\n异常信息:{1}\r\n异常堆栈:{2}", ex.GetType(), ex.Message, ex.StackTrace));
    }
}

**これに注意する必要があります。AppDomain.CurrentDomain.UnhandledExceptionイベントには、UnhandledExceptionEventArgs eというイベントパラメータがあり、boolタイプのIsTerminatingプロパティがあります。この属性は、この例外が原因で共通言語ランタイム(CLR)が終了するかどうかを示します。この属性がtrueの場合、このイベントをリッスンしても、このイベントのコードの実行後、プログラム全体がクラッシュして終了します(VSにいるため、 VSがキャッチしました。)

この方法で異常が検出されまし
ここに画像の説明を挿入
た。学習Webサイト参照してください
https : //www.cnblogs.com/tomahawk/articles/5993874.html
https://www.cnblogs.com/wangshenhe/archive/2012/11/14/ 2769605.html

最後に:
Windowsプログラムでは、Application.ThreadExceptionイベントとAppDomain.CurrentDomain.UnhandledExceptionイベントが同時に監視されている場合、例外は最初にApplication.ThreadExceptionイベントによってキャッチされます。ただし、Application.ThreadExceptionイベントは、プログラムのメインスレッドによってスローされた例外のみをリッスンできます。

元の記事を18件公開しました 賞賛されました0 訪問数233

おすすめ

転載: blog.csdn.net/qq_39217004/article/details/105280726