DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Throwの仕方

  • 題名: Throwの仕方
  • 著者: WON
  • 日時: 2007/09/05 19:42:25
  • ID: 20425
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[XP]
分類:[.NET]

 先程はありがとうございました。

もう1点だけお聞きしたいのですが

1.DataViewを返すもの
Public Function Dv() As DataView
Dim Cn As New SqlConnection
Dim Cmd As New SqlCommand
Dim DA As New SqlDataAdapter
Dim DS As DataSet = New DataSet
Dim strConnection As String = "接続文"

With Cmd
.CommandType = CommandType.Text
.CommandText = "SQL文"
  .Connection = Cn
End With
'**************************************************************
Try
Cn.ConnectionString = strConnection
Cn.Open()
DA.SelectCommand = Cmd
DA.Fill(DS)
Return MyDS.Tables(0).DefaultView
Catch ex As Exception
Throw New ApplicationException("システムエラー")
Return Nothing
Finally
Cmd.Dispose()
Cn.Close()
End Try
End Function

2.番号を返すもの
Public Function DNO() As Int32
Dim rdr As SqlDataReader
  Try
     少し省略しています
    param1 = Cmd.Parameters.Add("DOCNO", SqlDbType.Int)
param1.Direction = ParameterDirection.Output
Cmd.Connection = Cn
rdr = Cmd.ExecuteReader()
Return Cmd.Parameters("NO").Value
  Catch ex As Exception
Throw New ApplicationException("番号エラー")
Finally
Cmd.Dispose()
Cn.Close()
End Try
End Function

1.DataViewを1行も返せなかったとき
Throw New でそのようなメッセージを呼び出し元に返したい

2.同じようにExecuteReaderで1行も返せなかったとき
Throw New でそのようなメッセージを呼び出し元に返したい

その返し方を教えて下さい
Catch句でしかThrowを使えないと思っていますか?>そのように受け取りました。

Private Sub (ByVal parm As String)
If parm Is Nothing Then
Throw New ArgumentNullException(〜)
End If
End Sub

のようにどこでもThrowできます。

あとは気になった点。

> Catch ex As Exception
> Throw New ApplicationException("システムエラー")
> Return Nothing
> Finally

Returnが実行されるかをデバッグしてみてください。
また、呼び出し側はApplicationExceptionを受け取りますが、そこにはexの情報が含まれないことに注意してください。
この場合は通常inner As Exceptionを引数に持つオーバーロードのコンストラクタを使います。
すると受け取り側はInnerExceptionプロパティで参照することが出来ます。
#例外の原因となった例外というように祖先をたどることができるようになります。
最後に、今回のように新しい例外を作るのか、そのままexを投げる(引数なしでThrow)のかを検討してください。
#前者はそのプロシージャの仕様という位置付けになります。
■No20428に返信(まどかさんの記事)
ご返答ありがとうございます。

そうすると
1番目はDA.Fill(DS)の後に
IF MyDS.Tables(0).ROWS.Count <= 0 THEN
Throw New ApplicationException("データなし")
END IF

2番目はrdr = Cmd.ExecuteReader()の後に
IF Cmd.Parameters("NO").Value IS Nothing THEN
Throw New ApplicationException("番号なし")
END IF

となりますか?

呼び出し側で上記の条件の時、メッセージを表示させたいのですが?

(呼び出し側)
Try
DVを呼び出し(Functionプロシージャ DataViewを返すもの)

Catch
メッセージを表示

どのような感じになるのか
今一度、ご助言頂けないでしょうか?

宜しくお願いします。
キャッチしたい例外をCatch句で拾うだけですが。

Try
ファイルの読み込み処理の呼び出し
Catch notFoundEx As FileNotFoundException
「ファイルが見つかりません」の表示
Catch nullEx As ArgumentNullException
「ファイル名が指定されていません」の表示
End Try

先に書いたように、ApplicationExceptionを投げるということは
そのプロシージャは「〜のときにApplicationExceptionをスローする」という仕様になります。
ApplicationExceptionはいわゆる標準の例外のひとつですがその名のとおり広い意味の例外です。
原因と名前は一致してないと利用者が混乱します。
また、標準の例外というものがあります。>NullReferenceExceptionやArgumentExceptionなど
その中に意味が合うものがあるかどうかを確認して、あればそれを利用したほうがよいです。
独自の例外を作ることも出来ます。
Public Class CannotCreateDataViewException
Inherits Exception
' 独自のプロパティなど
End Class
Throw New CannotCreateDataViewException
ただし、独自の例外を乱立するのもよくありません。
例外か返値か、独自の例外にすべきかを検討してみてください。
#たとえば、1のパターンはNothingを返す仕様のほうが自然かもしれません。

MSDNの例外に関する記事とガイドラインについてご一読することをお勧めします。
  • 題名: Re[4]: Throwの仕方
  • 著者: WON
  • 日時: 2007/09/06 10:10:02
  • ID: 20435
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No20431に返信(まどかさんの記事)
まどかさん、大変丁寧な回答ありがとうございます。

独自の例外を作ることも出来ます。
Public Class CannotCreateDataViewException
Inherits Exception
' 独自のプロパティなど
End Class

の件、よく解りました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板