- PR -

Try の中

投稿者投稿内容
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2008-02-29 13:44
 こんにちは。

先程はありがとうございました。
もう1点お聞きしたいことがありますので
宜しくお願いします。
VB2005の環境です。

下記のようなコーディングをしました。
今まではOn Errorでコーディングしていましたが
Try Catchに変えようと思いまして・・・

何をお聞きしたいのかといいますと
Try から Catch ex の間に
いろいろな処理を入れてても問題ないのか
おききしたいのです。

データを取得したり、IF文があったり、ForのLOOPがあったり
皆さんは、多くの処理があるときは、どうされていますか?

*************************************************************************
Private Sub AASet()
Dim MyTbl As New DataTable
Dim CNT As Int16
Dim strSQL As String

Try
mintMPAGE = intPAGE
For CNT = 1 To 12
Me.Controls("lblOption" & CNT.ToString).Text = ""
Next
strSQL = " SELECT * FROM TBL"
'*******************************************************
MyTbl = GetData.GetDs().Tables(0)
If MyTbl.Rows.Count = 0 Then
Else
For Each ROW As DataRow In MyTbl.Rows
If ROW("MNO") = 0 Then
Me.Text = ROW("MTITLE")
Else
If ROW("MNO") = 99 Then
CNT = 12
Else
CNT = ROW("MNO")
End If
mMNO(CNT) = ROW("MNO")
mPGMID(CNT) = ROW("PGMID")
mMTYPE(CNT) = ROW("MTYPE")
If CNT < 10 Then
セット処理
END If
End If
Next
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
Me.Close()
End Try
End Sub

すいません、宜しくお願いします。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2008-02-29 13:49
回答ではないけれど、ソース貼るときは

[code]

[/code](実際は全て半角文字)

で囲んで頂けると大変助かります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-02-29 13:55
引用:

LANVINさんの書き込み (2008-02-29 13:44) より:

データを取得したり、IF文があったり、ForのLOOPがあったり
皆さんは、多くの処理があるときは、どうされていますか?


「ロジックでは回避できない例外が発生すると想定される処理」 だけ加えるようにしています。

コード:

    Try
        ' ロジックでは回避できない例外が発生すると想定される処理
    Catch ex As ...Exception
        ' 必要な例外処理
    End Try


これが案外少ないので、

コード:

    Try
        ' ロジックでは回避できない例外が発生すると想定される処理
    Finally
        ' 例外が起きてもやらなくてはならない処理
    End Try


こうなることが多いですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-02-29 14:32
未処理の例外を以下でキャッチする事もできます。

Application.ThreadException += new ThreadExceptionEventHandler(XXXXX);
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(YYYYY);

(Windowsでしたよね。ASP.NETの場合は別です。あとリソース開放等が微妙ですが)
LANVIN
大ベテラン
会議室デビュー日: 2007/03/12
投稿数: 211
投稿日時: 2008-02-29 14:34
回答ありがとうございます。

例えば
アプリケーション実行パス取得
APPでINIファイル参照
DataSet取得

とあった場合
Try
'*** パス取得
'*** INIファイル
'*** DataSet取得
Catch ex As Exception
MessageBox.Show(ex.Message)
Me.Close()
End Try
ではなく

'*** パス取得
Try
'*** INIファイル
'*** DataSet取得
Catch ex As Exception
MessageBox.Show(ex.Message)
Me.Close()
End Try
でしょうか?

パス取得は
Application.StartupPathで
例外が発生する可能性が低い為です。

この場合On Errorはコーディングしないのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-02-29 17:42
引用:

LANVINさんの書き込み (2008-02-29 14:34) より:

でしょうか?


仕様しだいなので答えられないです。 例外を握りつぶして良いものかどうかなど考慮する必要があります。 処理続行可能かどうか、処理を続行させなければならないのか。(入力したデータが消えるのは勘弁してくれというユーザーもいます)

引用:

この場合On Errorはコーディングしないのでしょうか?


On Error ではコーディングしないと思います。

処理続行不可能な例外ならいちいち Catch しないですね。 続行できないのですから。
その時は Application.ThreadException や AppDomain.UnhandledException を使って通知して終了すると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2008-02-29 18:03
後処理を考えたときに、Tryに複数のステップを書いた場合、
どのステップで例外になったのか、どこまで処理が進んだのか、何を廃棄し何を復旧しなければいけないのか
というような制御が出てきます。
どのステップでというのは事実上無理です。
コード:
Try
    i += 1
    命令
    i += 1
    命令
    ・・・・・
Catch ex As Exception
    Select Case i
        Case 1
            ・・・・
    End Select
End Try


のようなことをしなければいけなくなります。
なので、後処理ごとにTryで囲むということはあります。

Catchを特定のException派生型でいくつか並べてその種類ごとに後処理を書くというのもありますが
それも1ステップだからこそ判断できるわけで、
複数ステップの場合は例外の種類と特定のステップを暗黙で結びつけることになってしまいます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-03-01 07:39
引用:

まるくさんの書き込み (2008-02-29 13:49) より:
回答ではないけれど、ソース貼るときは

[code]

[/code](実際は全て半角文字)

で囲んで頂けると大変助かります。


 同じく回答ではないけれど、この内容であれば投稿時に「この投稿で BB コードを使わない」にチェックすれば、[ code] と書けたのではないかと思います。


引用:

LANVINさんの書き込み (2008-02-29 14:34) より:


だから、コードタグでくくってよ。大ベテランなんだからさぁ?
引用:
コード:
Try
   '*** パス取得
   '*** INIファイル
   '*** DataSet取得
Catch ex As Exception
   MessageBox.Show(ex.Message)
   Me.Close()
End Try

ではなく
コード:
'*** パス取得
Try
   '*** INIファイル
   '*** DataSet取得
Catch ex As Exception
   MessageBox.Show(ex.Message)
   Me.Close()
End Try


パス取得は
Application.StartupPathで
例外が発生する可能性が低い為です。
この場合On Errorはコーディングしないのでしょうか?


 Try を入力すると、Catch が自動で入力されますが、これはフィードバックして削ってもらおうと思うくらい、間違った挙動です。むやみやたらとキャッチするのは、ハンドで反則です(by NAL-6295さん)。try に対しては、finally が入るべきです。
 例外処理については、例外処理の実施<microsoft.com>を、まずは読んでください。catch ブロックを、例外を握りつぶすために使ってはいけません。
一例:
コード:
'' 必要な準備処理
Dim connection As DbConnection = ...
Try
    connection.Open();
    '' コネクションが開いている間必要な処理
Finally
    connection.Close();
End Try
'' コネクションが閉じていてもできる処理


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