- PR -

イベントハンドラでの例外Throwの可否について

1
投稿者投稿内容
まるひろ
会議室デビュー日: 2004/05/25
投稿数: 11
お住まい・勤務地: 東京
投稿日時: 2004-12-16 11:28
お世話になっております。
VB.NETでWindowsアプリケーションの開発をしています。

私の作った画面は、スタートアップフォームにして起動するのではなく、別クラス(Module)の"Sub Main()"からShowDialogメソッドで呼び出す方式をとっています。

で、Form上の各コントロールのイベントハンドラで例外が発生した場合はその例外をThrowし、呼び元であるMainメソッドのCatch部において、Form上で発生したすべての例外処理のハンドリングを一括して行おうと考えました。

ところが、Windows標準コントロールのイベントハンドラで発生した例外をThrowしようとしても、Mainメソッドへ返ってくれないようなのです。(ハンドリングされていない例外が発生しましたとのランタイムエラー(?)のダイアログが表示されます。)

GrapeCity社のInputMan for .NETのFunctionKeyコントロールのFunctionKeyPressイベントではMainまで例外を返してくれているようなので上記の方法を選択したのですが..
(ShowDialogメソッドで例外が発生したかのように振る舞っています。)

で思ったのが、そもそも
「イベントをハンドリングしているメソッドで例外が発生してもThrowしてはいけません」
みたいな言語仕様的なものがあるのかもということです。

「その通り。」とか、「そんなことはない。」とか、「自分はこんな方法で実現している」
みたいなレスをお願いします。
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-12-16 11:54
引用:

まるひろさんの書き込み (2004-12-16 11:28) より:
...
(ShowDialogメソッドで例外が発生したかのように振る舞っています。)
...


そう振舞うのは、ShowDialogメソッドが Form の出入り口
になっているからではないでしょうか?
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2004-12-16 11:56
引用:

ところが、Windows標準コントロールのイベントハンドラで発生した例外をThrowしようとしても、Mainメソッドへ返ってくれないようなのです。(ハンドリングされていない例外が発生しましたとのランタイムエラー(?)のダイアログが表示されます。)



そういうもんです。

これは、Windows の GUI の仕組みによるものです。

詳細が知りたければ、メッセージポンプやウィンドウメッセージのディスパッチなどの仕組みについて調べてみてください。

引用:

「イベントをハンドリングしているメソッドで例外が発生してもThrowしてはいけません」
みたいな言語仕様的なものがあるのかもということです。



ということはありません。

自ら throw しなくても、例えばファイル入出力に失敗した場合など、ランタイムが throw する場合だったあります。

イベントハンドラで発生した例外を捕捉するために、Application.ThreadExcepion イベントが用意されています。

_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
1

スキルアップ/キャリアアップ(JOB@IT)