- PR -

Try Catchステートメントのエラー処理について

1
投稿者投稿内容
miyu
会議室デビュー日: 2004/03/30
投稿数: 4
投稿日時: 2004-03-30 15:37
初めての書き込みです。よろしくお願いします。

ネットワークが遮断された場合を想定した、
ハード障害のテストを行っています。

Try Catchを利用し、処理中に例外が発生した場合は、
専用のメッセージを表示するようにコーディングしているのですが、
期待するメッセージが表示されません。

***表示されるメッセージ***
「基になる接続が閉じられました : 受信時に予期しないエラーが発生しました」


クライアントでデバック実行した場合は、
想定どおりTry Catchでエラー処理ができ、
意図したエラーメッセージを表示することができます。


想定外のメッセージ「基になる接続が閉じられました〜〜」が
表示される条件
1.ビルドして生成したexeを実行した時
2.Throwステートメントを使ってコード内のエラーをトラップし
  呼び出しもとのフォームに戻る時


****************処理の例******************

・From1のlnkUketsuke_LinkClickedを実行し、
 From2のtxtOperatorCD_KeyPressに遷移させる。
・From2のtxtOperatorCD_KeyPress処理中にネットワーク障害
 (LANを抜くなど)を起こす。
・ThrowステートメントでFrom1のlnkUketsuke_LinkClicked
 に戻り、例外処理の CCommon_Log.WriteErrLog(ex, "999")
 を実行したいが、想定外のメッセージ「基になる接続が閉じられました〜〜」
 が表示されてしまう。

※From1
Private Sub lnkUketsuke_LinkClicked
Try

      **内部処理**
    (From2に遷移しtxtOperatorCD_KeyPressを実行する)

Catch ex As Exception

'**例外処理
CCommon_Log.WriteErrLog(ex, "999")
End Try
End Sub

※From2
Private Sub txtOperatorCD_KeyPress
Try

  **内部処理**
    
Catch ex As Exception

    
'**例外処理
Throw ex

End Try
End Sub

*****************************************

説明が拙く、申し訳ありません。
解決策がお分かりになる方、ご指導お願いします。


一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-03-30 15:47
ソースが良く分かりません。

lnkUketsuke_LinkClicked()内でtxtOperatorCD_KeyPress()を実行と書いてありますが、txtOperatorCD_KeyPress()はPrivateですよね?
あと、想定外のメッセージ「基になる接続が閉じられました〜」をどこで書いているのかも分かりません。
PoH
常連さん
会議室デビュー日: 2003/09/09
投稿数: 48
投稿日時: 2004-03-30 16:45
メッセージ内容をネットワークでつないだ
DBに取りに行ってるとか
そんな落ちはないですよね?^^;
miyu
会議室デビュー日: 2004/03/30
投稿数: 4
投稿日時: 2004-03-30 16:57


言葉足らずの説明で申し訳ありません。


>lnkUketsuke_LinkClicked()内でtxtOperatorCD_KeyPress()を実行と書いてありますが、txtOperatorCD_KeyPress()はPrivateですよね?
 ⇒処理の例を修正しましたので参照してください。


>あと、想定外のメッセージ「基になる接続が閉じられました〜」をどこで書いているのかも分かりません。
 ⇒想定外のメッセージ「基になる接続が閉じられました〜」とは、メッセージ内容をコーディングしているのではなく、OS?のシステムエラーです。



****************処理の例******************

・Form1のlnkUketsuke_LinkClickedを実行した時、
 ShowDialogメソッドでForm2のダイアログを表示する。
・Form2のtxtOperatorCD_KeyPressイベントが実行された時に、
 意図的に例外(LANケーブルを抜くなど)を起こす。
・Form2で起こしたエラーをThrowステートメントでForm1の
 lnkUketsuke_LinkClickedに戻す。
・Form1の例外処理の中で エラーメッセージを表示させる処理
 (CCommon_Log.WriteErrLog(ex, "999"))を実行したいが、Form2から
 呼び出しもとのフォーム(Form1)にexをうまくThrowできず、
 OS側のシステムエラーで「基になる接続が閉じられました〜〜」
 が表示されてしまう。

※Form1
Private Sub lnkUketsuke_LinkClicked
Try

      **内部処理**
    (Form2をShowDialogメソッドで呼ぶ)


Catch ex As Exception

'**例外処理
CCommon_Log.WriteErrLog(ex, "999")  ←エラーメッセージを表示させる処理
End Try
End Sub


※Form2
Private Sub txtOperatorCD_KeyPress
Try

  **内部処理**
  (例外を発生させる)
    
Catch ex As Exception

    
'**例外処理
Throw ex

End Try
End Sub

一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2004-03-30 17:16
引用:

miyuさんの書き込み (2004-03-30 16:57) より:
 Form2から呼び出しもとのフォーム(Form1)にexをうまくThrowできず、



現象を確認しました。
確かにVisualStudioでデバッグ実行の時はShowDialog()を呼んでいる側に例外が飛んできますが、exeファイルを実行した時はきませんね。
なんだこれは・・・・・
もうちょっと色々やってみますね。
soramimi
会議室デビュー日: 2003/10/29
投稿数: 19
投稿日時: 2004-03-31 11:17
こちらが参考になると思います。
http://www.users.gr.jp/ml/archive/viewer.aspx?name=cs&no=4058
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-03-31 11:18
.NETにおいてWindowsフォームがメッセージを受け取ると、WndProcメソッドを呼び出しますが、ウィンドウメッセージ処理中に例外が発生するとOnThreadExceptionを呼び出します。デフォルトでは、この実装は今回表示されたようなダイアログボックスを表示するようになっています。

ではなぜ、デバッグだとそれが表示されないのかというと、Windowsフォームアプリケーションにデバッガがアタッチされている場合は、ウィンドウプロシージャでスローされた例外は補足されず、そのままコールスタックを遡るようになっているようです。
(書籍:プログラミング.NET Frameworkより)

そのため今回のようにデバッグ実行と、EXE実行で動作がかわってしまうようですね。
たぶん、この例外処理はForm1と2だけの関係だけでなく、Formが増えるたびに必要になってくると思われますので、System.Threading.ThreadExceptionEventHandlerデリゲートを利用して、エラー処理を一箇所にまとめてしまったほうが、きれいになるかもしれません。

#あう、またかぶった。書き込みタイミング悪い>自分


[ メッセージ編集済み 編集者: nodera 編集日時 2004-03-31 11:24 ]
miyu
会議室デビュー日: 2004/03/30
投稿数: 4
投稿日時: 2004-03-31 14:01

みなさん、ありがとうございました。
まだ、試行錯誤中ですが、前進できそうです。

大変勉強になりました!
1

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