- ひろれい
- ぬし
- 会議室デビュー日: 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
やっぱり、この名言を出さないわけにはいかないでしょう。
むやみにキャッチしないでね。ゴールキーパー以外はハンドで反則ですよ。
|