• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#の捕捉されない例外処理の対処をご教授願います)

C#で捕捉されない例外処理の対処法とは?

P_DIZZYの回答

  • P_DIZZY
  • ベストアンサー率50% (5/10)
回答No.4

フォームとは別のスレッドで発生した例外を処理するということでしょうか。 先ほどの参考にされていたURLのイベントですが, Application.ThreadExceptionイベントでは 注意する点が数点あります。 ・Windows Formsアプリケーションでのみ使用が可能である ・イベントが発生するのはメインスレッドで例外が発生した場合のみである (別スレッドのようなのでここで抜けてしまっている可能性がありますね) ・ThreadExceptionイベントハンドラ内でアプリケーションを終了させるコードを記述しないとアプリケーションは終了しない ・.NET Framework 1.1 SP1でApplication.ThreadExceptionイベントが発生しないケースがある 別スレッドの場合は「AppDomain.UnhandledExceptionイベント」こちらをご使用ください。 //フォームのLoadイベントハンドラ private void Form1_Load(object sender, EventArgs e) { //UnhandledExceptionイベントハンドラを追加 System.AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); //次のようにもできる //System.AppDomain curDom = System.Threading.Thread.GetDomain(); //curDom.UnhandledException += // new UnhandledExceptionEventHandler( // CurrentDomain_UnhandledException); } //UnhandledExceptionイベントハンドラ private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { try { Exception ex = (Exception)e.ExceptionObject; //エラーメッセージを表示する MessageBox.Show(ex.Message, "エラー"); } finally { //アプリケーションを終了する Application.Exit(); } } こちらのイベントについての注意点は下記のとおりとなります。 ・ThreadExceptionイベントとは違い、Windows Forms アプリケーションだけでなく、コンソールアプリケーションでも使える ・ThreadExceptionイベントとは違い、メインスレッド以外のスレッドで例外がスローされたときも発生します。 ・.NET Framework 1.1以前では、メインスレッド以外のスレッドでスローされた例外によりThreadExceptionイベントが発生した場合は、アプリケーションが終了しない。 (UnhandledExceptionEventArgs.IsTerminatingプロパティがFalseになります)。 ・メインスレッドで例外がスローされたときは、「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。...」というダイアログが表示され、UnhandledExceptionイベントは発生し (メインスレッドでの場合はThreadExceptionを使用してください。)

min-neko102
質問者

お礼

P_DIZZY様 迅速に回答して頂きまして誠に有難うございました。 とても励みになりました。

min-neko102
質問者

補足

P_DIZZY様 迅速なご回答、誠に有難うございます。 フォーム又は複数のソケット通信のどこかで発生している例外で対象スレッドを特定できません。 try-catch-finallyの漏れもすべて確認しましたが問題なく分からないのでメインで捕捉できない 例外をすべて捉えて、その情報をログに吐き.NETのダイアログを非表示することが目標です。 再現性は低いのでテストで直ぐに原因の特定と修正による動作検証ができればよいのですが、 思うように事が運んでいない状況です。 ご教授頂いた(修正後)について質問がございます。 以下の違いにより期待結果が異なるものなのでしょうか? (修正前) //UnhandledExceptionイベントハンドラを追加 Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); (修正後) //UnhandledExceptionイベントハンドラを追加 System.AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); ググッて以下を参考にし頑張ってます。  捕捉されなかった例外がスローされたことを知る  http://dobon.net/vb/dotnet/programing/unhandledexception.html  AppDomain.UnhandledException イベント(.NET Framework 3.5)  http://msdn.microsoft.com/ja-jp/library/system.appdomain.unhandledexception(v=VS.90).aspx  Application.ThreadException イベント(.NET Framework 3.5)  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.application.threadexception(v=VS.90).aspx 何卒、よろしくお願いいたします。

関連するQ&A

  • 例外時のエラーについて

    お世話になっております。 小さい会社のプログラマ(初心者)です。 意見を聞ける人もいなく、手探りで開発している状況なので、意見をお聞かせ願いたいと思っております。 .NetFrameworkのエラーメッセージ 「アプリケーションのコンポーネントでハンドルされていない例外が発生しました。[継続]をクリックするとアプリケーションはこのエラーを無視し、続行しようとします。[終了]をクリックすると、アプリケーションは直ちに終了します。・・・」 は、.NetFrameworkが親切心で出しているメッセージであってシステム会社の作ったシステムで出して良いメッセージじゃないと思っているのですが、どうでしょう? .NetFrameworkのエラーメッセージでは続行もでき、不完全なまま続行されると非常にまずいと思います。 せっかくTry~catchがあって例外クラスも作成できるのであれば、例外クラスでメッセージを表示してログを出すなりシステムを落とすなりするほうが絶対に良いと思っています。(本にもそう書かれていますし) それとも、これも色々手段がある中の一つの手なんでしょうか? 皆様にとっては超常識な質問だとは思いますがご回答お願いします。

  • Windows 7についてわからないので質問です

    「Windows 7 Start Button Chager v2.6」を使おうと思ったんですが、 exeを実行したら 「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。[続行]をクリックすると、アプリケーションはこのエラーを 無視し、続行しようとします。[終了]をクリックすると、アプリケーションは直ちに終了します。 パス 'C:\Windows\explorer_backup_w7sbc.exe'へのアクセスが拒否されました。」 と表示されます。仕方ないので無視して続行を押して進んだのですが、スタートボタンの画像を選ぶ所まではいけたのですが スタートボタンを選んで開こうとするとまた同じメッセージが出てそこから進めません… どうすれば出来るようになるのでしょう?困ってます、アドバイスお願いします。ちなみに私の7は Ultimate 64bitです。

  • MicrosoftNETFrameworkエラー

    オークションサポートというソフトをインストールしたのですが、利用しようとすると Microsoft NET Framework のエラーが出ます。  アプリケーションのコンポーネントで、ハンドルされていない例外が発生しまし  た。「続行」をクリックすると、アプリケーションはこのエラーを無視し、続行し  ようろします。「終了」をクリックすると、アプリケーションは直ちに終了します。  パス’C¥ProgramFile(x86)¥AuctionSupport¥auction_support.ini’へ  のアクセスが拒否されました。 と表示されます。 詳細の最後には、  JITデバッグが有効なときは、このダイアログボックスで処理するようも、  ハンドルされていない例外はすべてコンピューターに登録された  JITデバッガに設定されなければなりません。 とメッセージされます。 何が原因なのか、どなたか教えて頂けないでしょうか? どうぞよろしくお願い致します。

  • POSについて

    POS(Point Of Sales)について質問です。 本日ショートカットを起動し、ID・passを入力した所 「アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。「続行」をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。「終了」をクリックすると、アプリケーションは直ちに終了します。」 データベースの形式'Cドライブのとあるmdbファイル'を認識できません。 と出ました。 続行してもこのエラーは表示され、終了を押すとアプリケーションが終了します。 どなたか改善策を教えて下さい。

  • このメッセージの意味と対処法教えてください

    アプリケーションのコンポーネントでハンドルされていない例外が発生しました。続行をクリックすると...終了します。 要求は中止されました。SSL/TLSのセキュリティで保護されているチャネルを作成できませんでした。 というメッセージが出ます。 対処法を教えてください。 ※OKWAVEより補足:「富士通FMV」についての質問です。

  • VB2008の64bitでの使用について

    こんにちは どなたか教えていただけると非常に助かります。 VB2008で簡単なMSアクセス2010と連携した在庫管理システムを作成しました。(Win7の32bitPCで開発しました) 32bitPCでは問題なく動作しましたが64bitPCでは以下のエラーメッセージが表示され使用できませんでした。 --------------------------------------------------------------------- Microsort .NET Framework アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました、[続行]をクリックすると、アプリケーションはこのエラーを無視しようとします。[終了]をクリックすると、アプリケーションは直ちに終了します。 プロバイダーが見つかりません。正しくインストールされていない可能性があります。 --------------------------------------------------------------------- [続行]を押すて進むと、今度は以下のエラーメッセージが表示されます。 --------------------------------------------------------------------- 在庫管理システム アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました、[続行]をクリックすると、アプリケーションはこのエラーを無視しようとします。[終了]をクリックすると、アプリケーションは直ちに終了します。 この操作を実行するために接続できません。このコンテキストで閉じているかあるいは無効です。 --------------------------------------------------------------------- インストーラの作成方法に誤りがあるのでしょうか。 どなたかわかる方、ご教授お願いします。

  • 毎回、画面に表示される

    アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。(続行)をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。(終了)をクリックすると、アプリケーションは直ちに終了します。 Windows ランタイム型Windows.Foundation.TypedEventHandler2が見つかりませんでした。 と毎回表示される。 ※OKWAVEより補足:「富士通FMV」についての質問です。

  • C# マルチスレッドにおける例外処理

    下記のようなデリゲートを利用したマルチスレッドのプログラムを組みました。 しかし、マルチスレッド内で例外がおきても、正常にプログラムが終了してしまいます。 (try-catchでも例外を捕捉できません) マルチスレッドプログラムにおいて、例外を捕捉するにはどうすれば、いいのでしょうか? using System; using System.Threading; class Class1 { delegate void delg(); public static void Main() { delg d = new delg(multi); d.BeginInvoke(new AsyncCallback(call), null); //マルチスレッド開始 System.Threading.Thread.Sleep(500); //マルチスレッドで例外を強制的に投げているので、 //ここまでたどり着く前にアプリケーションが落ちるはず。 //しかし、実際には正常終了。 Console.WriteLine("メインメソッド 正常終了"); } public static void multi() { Console.WriteLine("マルチスレッドで実行中"); throw new Exception(); //例外を強制的に投げる。 } public static void call(IAsyncResult ar) { Console.WriteLine("コールバックメソッド実行"); } }

  • 例外で06が0000:0000800で発生しました。

    win98です。作業中に「例外で06が0000:0000800で発生しました。現在のアプリケーションを終了します」という青い画面が度々出てきます。 「どれかキーを押すと現在のアプリケーションは強制終了されます」とありますが終了はされません。「Ctrl+Alt+Delキーをもう一度押すとコンピューターが再起動します」とありますが再起動はされません。「どれかキーを押すと続行します」とありますが続行しません。 なにをやっても動かないので、電源から強制終了することになります。どうしたものでしょうか。

  • 掲示板等にいくと例外のエラーが発生!

    インターネット接続中に掲示板やチャットのリンクをクリックすると、、、 例外OEがVXDMC SCAN32(01)+000279BFの0028:C14FE41Fで発生しました。 現在のアプリケーションを終了します。 *どれかキーを押すと、現在のアプリケーションは強制終了されます。 *Ctrl+Alt+Delキーをもう一度押すと、コンピューターが再起動します。  アプリケーションで保存していないデータはすべて失われます。  どれかのキーを押すと、続行します。 となりそのまま、キーを押すと今度は 例外OEが0246:014F480Dで発生しました。 現在のアプリケーションを終了します。 となり、もう一度キーを押すと同じようなエラーが出ます。 最終的には使えるようになるのですが、掲示板やチャットなどのリンクをクリックするとこのような現象になります。 ほかのリンクは大丈夫なのです。 リソースは80パーセントはあります。 まずは何をしたら良いのか教えて下さい。