- PR -

【ASP.NET】クラス内で発生したエラーの捕らえ方

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-29 13:37
現在、ASP.NET(VB.NET)で開発しています。

初心者的な質問で申し訳ないのですが・・・

以下のようなクラスを作成し、
コード:
Public Class DBAccess
    Public Overloads Shared Sub Exec_Command(ByVal ls_Sql As String)
        Dim lo_Command As Oracle.DataAccess.Client.OracleCommand
        Dim lo_Transaction As Oracle.DataAccess.Client.OracleTransaction

        Try
            Dim lo_Conn As New Oracle.DataAccess.Client.OracleConnection(String.Format(ConfigurationSettings.AppSettings("connstr")))

            Try
                lo_Conn.Open()

                Try
                    lo_Transaction = lo_Conn.BeginTransaction()

                    lo_Command = New Oracle.DataAccess.Client.OracleCommand(ls_Sql, lo_Conn)
                    lo_Command.ExecuteNonQuery()
                    lo_Transaction.Commit()
                Catch ex As Oracle.DataAccess.Client.OracleException
                    lo_Transaction.Rollback()
                Finally
                    If Not lo_Command Is Nothing Then lo_Command.Dispose()
                End Try
            Finally
                If Not lo_Conn Is Nothing Then lo_Conn.Close()
                If Not lo_Conn Is Nothing Then lo_Conn.Dispose()
            End Try
        Finally
        End Try
    End Sub
End Class


以下のように使用しています。
コード:
Try
   DBAccess.Exec_Command(ls_Sql)
Catch ex As Exception
   ll_ErrCnt = ll_ErrCnt + 1
   la_arErr.Add("Oraエラー" & ex.Message & " SQL=" & ls_Sql)
End Try


現在、クラス内でエラーが発生した場合、呼び元では判断できません(Catch できない)。
これは、どうしてなのでしょうか?

なにぶん、今回初めてクラスの使用に挑戦していますので、「根本的に違うよ」という問題もあると思いますので、そういったご指摘でも構いません。

よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-29 13:49
引用:

ひろれいさんの書き込み (2006-03-29 13:37) より:

現在、クラス内でエラーが発生した場合、呼び元では判断できません(Catch できない)。
これは、どうしてなのでしょうか?


Catch 句で然るべき処理をされたと見なしたいからです。
逆を言えば、再スローすれば良いのです。(Throw を書く)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
買太郎
会議室デビュー日: 2006/03/27
投稿数: 10
お住まい・勤務地: 大阪府
投稿日時: 2006-03-29 13:56
一度例外をCatchした場合、呼出元にもCatchさせるには、
一度Catchした例外を再度 Throwしましょう。

Catch ex As Oracle.DataAccess.Client.OracleException
lo_Transaction.Rollback()
Finally

という部分のFinally前に、

Throw ex
とか、
Throw new XXXException("DBエラーっす!",ex)
とかで、再度Throw すれば行けます。

それにしても、じゃんぬさんの回答は早いですね〜
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-29 14:06
回答が早いのはソース コードを書いて具体例を示さなかったから... ですね。(;^-^)

コード:

    Try
        ' TODO : 主処理
    Catch exOracle As Oracle.DataAccess.Client.OracleException
        ' TODO : 然るべき例外処理
        ' 再スロー
        Throw
    Catch ex As System.Exception
        ' 再スロー
        Throw
    Finally
        ' TODO : 然るべき後始末
    End Try


呼び出し元に例外が通知されます。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-29 14:21
じゃんぬさん、買太郎さん、お返事ありがとうございます。
引用:

じゃんぬねっとさんの書き込み (2006-03-29 14:06) より:

回答が早いのはソース コードを書いて具体例を示さなかったから... ですね。(;^-^)


コードが無くても、じゃんぬさんのおっしゃることは分かりましたよ(^o^)
実コードで試しておりました。

C系では例外をキャッチするのは当たり前なのでしょうね。
旧VBでは、On Error でしたから、Throw という知識がありませんでしたm(_ _)m
ありがとうございました。

引用:

コード:

    Try
        ' TODO : 主処理
    Catch exOracle As Oracle.DataAccess.Client.OracleException
        ' TODO : 然るべき例外処理
        ' 再スロー
        Throw
    Catch ex As System.Exception
        ' 再スロー
        Throw
    Finally
        ' TODO : 然るべき後始末
    End Try


呼び出し元に例外が通知されます。


じゃんぬさんの例題を見ますと、Oracle の出す例外とシステムが出す例外を分けて Catch されていますが、DBアクセスしかしていなくても、このようにした方が安全なのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-29 14:36
引用:

ひろれいさんの書き込み (2006-03-29 14:21) より:

じゃんぬさんの例題を見ますと、Oracle の出す例外とシステムが出す例外を分けて Catch されていますが、DBアクセスしかしていなくても、このようにした方が安全なのでしょうか?


そんなことはないです。

本当に予期しない例外は「業務続行不可能」な例外なので、
Application.ThreadException にお任せした方が良いです。
臨機応変ではありますが、予期しないものは何もしない方が良いです。

つまり... あれはただの例です。
例外名が思い浮かばなかったのが敗因です。(;^-^)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-29 15:13
引用:

じゃんぬねっとさんの書き込み (2006-03-29 14:36) より:

そんなことはないです。

本当に予期しない例外は「業務続行不可能」な例外なので、
Application.ThreadException にお任せした方が良いです。
臨機応変ではありますが、予期しないものは何もしない方が良いです。

つまり... あれはただの例です。
例外名が思い浮かばなかったのが敗因です。(;^-^)


分かりました(^_^;)
「Catch 句も複数書けるんだよぉ」という例題だと捉えておきます(^o^)
 <実際、知りませんでしたし・・・>
ありがとうございました。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-03-29 22:47
 やっぱり、この名言を出さないわけにはいかないでしょう。
むやみにキャッチしないでね。ゴールキーパー以外はハンドで反則ですよ。

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