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杯、自由に頼むとしたら何を頼みますか? 最初はビールという縛りは無しにして、好きなものを飲むとしたら何を飲みたいですか。
-
あなたにとってのゴールデンタイムはいつですか?
一週間の中でもっともテンションが上がる「ゴールデンタイム」はいつですか? その逆で、一週間でもっとも落ち込むタイミングでも構いません。 よかったら教えて下さい!
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
System.IO.Directory.GetFilesの順番
Visual Basic(VBA)
-
【C#/Java?】try-catchでcatchせずにfinallyは一般的?
その他(プログラミング・Web制作)
-
CloseとDisposeの違い
Visual Basic(VBA)
-
-
4
C# インスタンスの破棄
その他(プログラミング・Web制作)
-
5
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
6
Visual Studio 「AnyCpu」について
C言語・C++・C#
-
7
TCP/IP通信時のサーバーからの受信
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
時間の取得
-
ファイルダイアログを開いた時...
-
全角スペースのチェックについて
-
if文からcase文への置き換え
-
例外ってIf文の中に入れますか...
-
XMLパーサの種類について混乱し...
-
VB.Net Object型 空かどうか
-
メソッドが存在するかどうかの...
-
C#の捕捉されない例外処理の対...
-
【java】ファイル名から画像を取得
-
VC++におけるCStringの変換
-
【JSPがブラウザで表示されませ...
-
VBA Evaluate関数 型が一致しま...
-
String型の日付(2005/11/25)の...
-
文字列からダブルクオートの削除
-
エクセルVBAで、条件に一致する...
-
配列の重複する値とその個数を...
-
変数名の付け方
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.Net Object型 空かどうか
-
VB.NETで16進数が正しいかどう...
-
連続する「\\」をひとつの「\\...
-
VBA Evaluate関数 型が一致しま...
-
Timestamp型への変換について(J...
-
文字列からダブルクオートの削除
-
String型の日付(2005/11/25)の...
-
【JAVA】与えられた金額を貨幣...
-
C#の捕捉されない例外処理の対...
-
時間の取得
-
C# UriFormatExceptionの回避
-
VC++におけるCStringの変換
-
例外ってIf文の中に入れますか...
-
nullで、return出来るのはどん...
-
0除算の例外処理ができない!!...
-
WebClient()以外でネットにアク...
-
Javaで文字列をゼロ埋め(ゼロパ...
-
Excelでのエラー
-
タトゥーや墨を入れる人の共通点
おすすめ情報