- PR -

VB.NETで開発したプログラムが、実行時に起こす不可解な現象について(catchできないエラーが発生)

投稿者投稿内容
Katsumi
会議室デビュー日: 2002/08/15
投稿数: 11
投稿日時: 2005-12-19 12:30
開発したプログラムを実行すると、理由のわからない現象がでています。

現象

 VB.NETで開発したプログラムを、開発環境の「デバッグ」→「開始」で実行して、
 立ち上がってきた画面で、なにかのアクションを行うと、異常終了します。
 このアクションというのが、
 ・コンボボックス、グリッドをクリック(Clickイベントは使っていません)
 であったり、
 ・画面を閉じる
 であったりさまざまです。

 また、すべてのロジックはtry catchで囲って、私たちがコーディングした部分は
 必ず専用のエラーメッセージボックスにでるようになっているにもかかわらず、
 この落ち方をするときは、VB.NETが出すエラーメッセージボックスに出てしまいます。
 (どこで落ちているのかわかりません。)

 また、この現象は、出たり出なかったりします。再現性が低いです。

この画面を他のVB.NETのインストールされている端末で実行させても発生します。

この画面が他の画面と異なるのは、
・コード量が多いこと(3万5千行くらいあります)
・タブコントロールを使っています。
(画面にタブコントロールが張ってあって、ボタン、グリッド、コンボボックスなどは
 すべて、そのコントロールの上に載っています。)
ということです。

原因がわからずどうしたらよいか、困っています。
ソースが巨大だとだめなのでしょうか?
スレッドなどは使っていません。
なにか、原因や回避方法をご存知の方がいらっしゃいましたら
ぜひ、教えていただきたいです。
「うちでも現象でていて、こうやって、しのいでいるよ」など
情報をいただけたらありがたいです。
よろしくお願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2005-12-19 12:50
諸農です。

発生しているのは特定のプログラムでしょうか?
それとも、その端末で作成する全部のアプリで発生するのでしょうか?
どの段階でその現象が出ますか?
特定のコントロールの貼り付け以降とか、
特定のコードを追加した後からとか。
再現性が低いとのことですので、
処理のログを取るようにしてみてはいかがでしょうか。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2005-12-19 12:55
こんにちは。

引用:

この落ち方をするときは、VB.NETが出すエラーメッセージボックスに出てしまいます


ここに何て書かれていますか?

引用:

また、すべてのロジックはtry catchで囲って、私たちがコーディングした部分は
必ず専用のエラーメッセージボックスにでるようになっているにもかかわらず、


どうやって囲っていますか?
コード:
catch(Exception e)


だと厳密には全てをキャッチできないですよね?
_________________
囚人のジレンマな日々
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-12-19 13:30
引用:

Katsumiさんの書き込み (2005-12-19 12:30) より:

また、すべてのロジックはtry catchで囲って、私たちがコーディングした部分は
必ず専用のエラーメッセージボックスにでるようになっているにもかかわらず、


これは、Application.ThreadException でやって頂きたいですね...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Katsumi
会議室デビュー日: 2002/08/15
投稿数: 11
投稿日時: 2005-12-19 14:00
引用:

Jubeiさんの書き込み (2005-12-19 12:50) より:
発生しているのは特定のプログラムでしょうか?
それとも、その端末で作成する全部のアプリで発生するのでしょうか?
どの段階でその現象が出ますか?
特定のコントロールの貼り付け以降とか、
特定のコードを追加した後からとか。
再現性が低いとのことですので、
処理のログを取るようにしてみてはいかがでしょうか。


現象は、ひとつのプロジェクトの中の、ひとつの画面でのみ発生しています。
発生するときは、以下の手順で発生しています。
@開発環境から実行させます。(「デバッグ」→「開始」、あるいは、ツールバーの右向き矢印アイコンを押します)
Aアプリケーションのログイン画面が表示されます。
 ログイン後、該当画面を開くためのボタンを押します。(内部的にはShowDialogで表示しています。)
B問題の画面が表示されます。

現象がでないときは、何事もなく処理できます。
現象がでるときは、
・画面に張り付いているコンボボックスをマウスでクリックした瞬間(コンボボックスにClickイベントのためのメソッドはありません。)
だったり、
・画面に張り付いているTrueDBGridをクリックした瞬間(TrueDBGridにClickイベントのためのメソッドはありません。)
だったり、
・画面で処理を終えて、閉じるボタンを押して画面が消えた瞬間
だったりします。

ありがとうございます。
発生現象を正しく伝えられるためにも、
より詳しい処理のログのメモを取っていかないといけませんね。
雲山
会議室デビュー日: 2005/01/17
投稿数: 17
お住まい・勤務地: 流浪の砂布巾
投稿日時: 2005-12-19 15:02
じゃんぬねっとさんがご指摘されてますが、以下のようにしてハンドルできないエラーも捉えてはどうでしょうか?

※アプリ用
<STAThread()> _
Shared Sub Main()

' ThreadExceptionイベント・ハンドラを登録する
AddHandler Application.ThreadException, AddressOf ApplicationThreadException

' UnhandledExceptionイベント・ハンドラを登録する
AddHandler Thread.GetDomain().UnhandledException, AddressOf ApplicationUnhandledException

Application.Run
End Sub


' (Windowsアプリケーション用)
Public Shared Sub ApplicationThreadException(ByVal sender As Object, ByVal e As ThreadExceptionEventArgs)
ShowErrorMessage(e.Exception, "Application.ThreadExceptionによる例外通知です。")
End Sub

' (主にコンソール・アプリケーション用)
Public Shared Sub ApplicationUnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
Dim ex As Exception = CType(e.ExceptionObject, Exception)
If Not ex Is Nothing Then
ShowErrorMessage(ex, "Application.UnhandledExceptionによる例外通知です。")
End If
End Sub

Public Shared Sub ShowErrorMessage(ByVal ex As Exception, ByVal extraMessage As String)

Dim ErrMsg As New StringBuilder
Dim swFile As StreamWriter

ErrMsg.Append(extraMessage & vbCrLf & "――――――――" & _
vbCrLf & vbCrLf & _
"エラーが発生しました。開発元にお知らせください" & _
vbCrLf & vbCrLf & _
"【エラー内容】" & vbCrLf & ex.Message & vbCrLf & vbCrLf & _
"【スタックトレース】" & vbCrLf & ex.StackTrace)

MessageBox.Show(ErrMsg.ToString)

'PATH確認
If Directory.Exists(Directory.GetCurrentDirectory & "\log") = False Then
Directory.CreateDirectory(Directory.GetCurrentDirectory & "\log")
End If
Try
'OPEN
swFile = New StreamWriter(Directory.GetCurrentDirectory & "\log\" & Date.Now.ToString("yyyyMMdd_HHmmss") & ".log", _
False, System.Text.Encoding.Default)
swFile.Write(ErrMsg.ToString)
Finally
'CLOSE
swFile.Close()
End Try
Application.Exit()
End Sub

 こんな感じでログファイル化してみてはどーでしょうか?

[ メッセージ編集済み 編集者: 雲山 編集日時 2005-12-19 15:04 ]
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-12-19 15:06
引用:

現象は、ひとつのプロジェクトの中の、ひとつの画面でのみ発生しています。
発生するときは、以下の手順で発生しています。

現象がでないときは、何事もなく処理できます。
現象がでるときは、
・画面に張り付いているコンボボックスをマウスでクリックした瞬間(コンボボックスにClickイベントのためのメソッドはありません。)
だったり、
・画面に張り付いているTrueDBGridをクリックした瞬間(TrueDBGridにClickイベントのためのメソッドはありません。)
だったり、
・画面で処理を終えて、閉じるボタンを押して画面が消えた瞬間
だったりします。


この文章からすると十分に再現性があります。
つまり原因がある「はず」です。
オブジェクト変数がどうのこうのというメッセージと予想してみたりします。
コンストラクタ、Load、Closingなんかであるべきものとして記述されているにもかかわらず
中身が無いって言う落ちではないですかね。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2005-12-19 16:13
WindowsAPIやアンマネージドな関数などは使用していませんか?

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