C#で作成した自前のプログラムでたまにダイアログが出力される事象を抑止したいので、
ご教授の程よろしくお願いいたします。
アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。
[続行]をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。
[終了]をクリックすると、アプリケーションは直ちに終了します。
スレッドを中止しようとしました。
ダイアログには、詳細(D)・続行(C)・終了(Q)ボタンと右上角の×ボタンがあり、
×ボタンでダイアログを閉じることで、その後の動作に支障はないといった現象です。
この不要なダイアログの抑止の解決策を何卒、ご教授の程よろしくお願いいたします。
No.5ベストアンサー
- 回答日時:
Thread.GetDomainメソッドはスレッドが実行されているアプリケーションドメインを返すメソッドですので同じ処理になります。
コンストラクタでハンドルされない例外が発生すると, 実際には ThreadException イベントは発生しませんのでメインスレッド側ではここが抜け道になってしまいます。
ThreadException イベントはメインスレッドでメッセージループが実行されたら発生するようになる
のでメッセージループ前に発生しそうなものはtry-catchを入れればほとんど防げると思います。
自分でソケットを作成して通信処理している場合はパケット処理をするために作成した部分などで
思いもよらぬミスや見落としなどから例外が発生することが比較的多いので注意してソースを
見直すと間違えを見つけて例外が発生しなくなることもあります。
ハンドルされていない例外の処理
http://www.hrk-exp.net/2011/04/20110414.html
ずばり!という回答ができずすみません(T_T)
スレッド処理は過去同じく例外特定が困難で修正に苦労した記憶があります。。。
開発環境上でデバッグ実行などで処理させると特定できるものもありますので
ミスがないか、MicrosoftがMSDN等で認めている.Net Frameworkのバグがないかを確認
をしてみてください。
再現性が悪いものは原因特定がよけい大変ですが、再現性が低い=思わぬところにミスがあり
特定条件で発生するバグの可能性が大きいので見落としがあるかもしれません。
過去Microsoft側のバグでどうやっても防げない例外が発生するものがありましたが。。。
例外補足についていろいろ調べられた方のURLも記載しておきましたのでそちらも
ご参考になれば幸いです。
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を使用してください。)
この回答への補足
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/unhandlede …
AppDomain.UnhandledException イベント(.NET Framework 3.5)
http://msdn.microsoft.com/ja-jp/library/system.a …
Application.ThreadException イベント(.NET Framework 3.5)
http://msdn.microsoft.com/ja-jp/library/system.w …
何卒、よろしくお願いいたします。
No.3
- 回答日時:
プログラム上のどこかでバグが存在しています。
メソッドにtry-catchを入れることで例外処理が可能です。
private void hogehoge()
{
try
{
・・・・
}
catch(Exception e)
{
・・・・
}
}
のように入れると例外が発生した場合はcatch内の処理を実行するように
なります。
Exception eにはエラーのメッセージなどが保存されていますので
表示するとどこでエラーが起きてるか分かりやすくなります。
これを入れてcatchに飛ぶ場所をブレイクポイントを入れてステップ実行
で探してバグを見つけて直すこともできます。
try-catchでも捕まえられない例外も存在しますのでその点だけはご注意下さい。
ほとんどの場合これでエラーダイアログがWindowsから通知されることはなくなります。
この回答への補足
ご回答誠に有難うございます。
言葉足らずで失礼しましたが、質問の主旨は、以下につきます。
>try-catchでも捕まえられない例外も存在しますのでその点だけはご注意下さい。
対処方法をご存じでしたら更なるご教授をよろしくお願いします。
ちなみに以下URLを参考にメインに処理されていない例外をハンドルを登録しましたが、
ログに吐かれず.NETのダイアログが出力されてしまいました。
.NET TIPS 適切に処理されなかった例外をキャッチするには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/320 …
No.2
- 回答日時:
ハンドルされていない例外が発生しないようにすれば良い。
つまり、ハンドルされていない例外が発生するようなバグがあるから、バグを潰せば良い。
簡単に言えば「バグってるからバグ直してから出直して来い」って事。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ノートパソコン Win10 EXCEL でのエラー 2 2022/04/03 15:57
- iOS Gragebandでのみ左クリックが有効にならない 1 2022/08/19 13:18
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- その他(Microsoft Office) windows10で作業を終了する際の「保存しますか はい いいえ」を表示させずに自動で保存する方法 6 2023/03/15 11:29
- C言語・C++・C# Seleniumで「ファイルを開く」ダイアログボックスのフォルダ指定する方法を教えてください。 1 2022/05/09 07:38
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Microsoft ASP Windows10エンタープライズ版をインストールしたらアプリが使えなくなった 3 2023/03/07 11:08
- Windows 7 Media Playerが開かない。ファイルアイコンを右クリックしても「プロパティ」が表示されない。 2 2023/02/05 14:45
- その他(データベース) Accessフォームからパラメーターで表示したレコードを指定のExcelのセルへ転送する方法について 2 2022/08/22 18:04
このQ&Aを見た人はこんなQ&Aも見ています
-
カンパ〜イ!←最初の1杯目、なに頼む?
飲み会で最初に頼む1杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
秘密基地、どこに作った?
小さい頃、1度は誰もが作ったであろう秘密基地。 大人の今だからこそ言える、あなたの秘密基地の場所を教えてください!
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
プリン+醤油=ウニみたいな組み合わせメニューを教えて!
プリンと醤油を一緒に食べると「ウニ」の味がする! というような意外な組み合わせから、新しい味になる食べ物って色々ありますよね。 あなたがこれまでに試した「組み合わせメニュー」を教えてください。
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
C# インスタンスの破棄
その他(プログラミング・Web制作)
-
CloseとDisposeの違い
Visual Basic(VBA)
-
-
4
【C#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
-
5
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
6
Visual Studio 「AnyCpu」について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
【JAVA】与えられた金額を貨幣...
-
Timestamp型への変換について(J...
-
文字列からダブルクオートの削除
-
VB.Net Object型 空かどうか
-
連続する「\\」をひとつの「\\...
-
javaプログラムで背景色を変更...
-
0除算の例外処理ができない!!...
-
SQLException getNextException()
-
C# UriFormatExceptionの回避
-
LISPで例外を発生させるには?
-
nullで、return出来るのはどん...
-
WebClient()以外でネットにアク...
-
変数名の付け方
-
パワーポイントのVBAでテキスト...
-
エクセルVBAで、条件に一致する...
-
エクセルVBA 画像を貼り付ける...
-
private static という変数の修飾
-
インスタンス参照でアクセスで...
-
Excel VBA 定数にオブジェクト...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.Net Object型 空かどうか
-
連続する「\\」をひとつの「\\...
-
VBA Evaluate関数 型が一致しま...
-
ファイルダイアログを開いた時...
-
文字列からダブルクオートの削除
-
Excelでのエラー
-
C#の捕捉されない例外処理の対...
-
VC++におけるCStringの変換
-
時間の取得
-
String型の日付(2005/11/25)の...
-
VB.NETで16進数が正しいかどう...
-
Timestamp型への変換について(J...
-
例外ってIf文の中に入れますか...
-
0除算の例外処理ができない!!...
-
カンマ付数字をDBへ追加する...
-
タトゥーや墨を入れる人の共通点
-
全角スペースのチェックについて
-
javaプログラムで背景色を変更...
-
C# UriFormatExceptionの回避
おすすめ情報