ずいぶん以前に例外の扱いに対して
http://blogs.wankuma.com/ognac/archive/2006/09/22/39319.aspxとhttp://blogs.wankuma.com/ognac/archive/2007/08/06/88970.aspxを書いたのですが、お陰様でスタンスが決まりました。
プログラムは落ちてはいけないというのが私のベースです。
Public Function Div(ByVal a As Integer, ByVal b As Integer) As Integer
If b = 0 Then Throw New ApplicationException(" b=0 で呼ばれた")
'若しくは
Debug.Assert(b <> 0, " b=0 で呼ばれた")
Return a \ b
End Function
のように、例外が予想できる箇所には判定文を書きます。
if isnumeric(a) then b = cint(a) など
業務ロジック上 b=0 で呼ばれることはない。だから
Public Function Div(ByVal a As Integer, ByVal b As Integer) As Integer
Return a \ b
End Function
「これで十分だ。事前判定は冗長だから不要だ。」との意見もあります。
RDBのデータ取得でも
Public Function 項目引用() As String
Dim dt As New DataTable()
Dim sql As String = "select 項目 from xxxx where code=@code"
Dim param As New List(Of String)
Dim cmd As New SqlCommand
'パラメータセット
':
Dim adpt As SqlDataAdapter = New SqlDataAdapter(cmd)
adpt.Fill(dt)
Dim 引用値 As String
With "A:必ずレコードが存在する前提で書かれている"
引用値 = dt.Rows(0)(0).ToString
End With
With "B:事前判定を施す"
If dt.Rows.Count > 0 Then
引用値 = dt.Rows(0)(0).ToString
Else
Debug.Assert(False, "データがなくなっている!")
End If
End With
Return 引用値
End Function
「データが存在することはシステムの前提だから、都度データ存在Checkするのは冗長で無意味だ」との意見もあります。
何らかの理由でデータが無くなったら"落ちまっせ"と言うと、「それは不可抗力だからStackOverなどの不可避例外と同等だから、OSの例外に任せたら良い」とのこと。
「アプリで拾う例外は、回復可能だから拾うので、回復不可能な例外は拾うべきではない」..と主張されると、一理あるような気がする優柔不断な私...orz。
確かに DiskFullやStackOverなど手の出せない例外もありますが、想定できる異常ケースは記述したほうが良いと考えてます。
c = a \ b
で b=0 の判定が書かれてないと、手抜きや無知と思われそうで、精神的にイヤというのもあります。
精神安定剤と冗長なコードはトレードオフ?
これって見てくれを気にしている事になるのかなぁ