検証メソッドが例外を投げるのはどうなの?

以前書いたのが見つかったのでちょっと書いてみる。(普段は日本語でコーディングはしていませんが。)

以下、日付を検証する部分のソースコード

[Visual Basic]

Public Class 妥当性検証



Private Sub New()

End Sub



Public Shared Function 日付として妥当だ(ByValAs Integer, ByValAs Integer, ByValAs Integer) As Boolean

Return 年として妥当だ(年) AndAlso 月として妥当だ(月) AndAlso 日として妥当だ(年, 月, 日)

End Function



Public Shared Function 年として妥当だ(ByValAs Integer) As Boolean

Return (DateTime.MinValue.Year <= 年) AndAlso (年 <= DateTime.MaxValue.Year)

End Function



Public Shared Function 月として妥当だ(ByValAs Integer) As Boolean

Return (DateTime.MinValue.Month <= 月) AndAlso (月 <= DateTime.MaxValue.Month)

End Function



Public Shared Function 日として妥当だ(ByValAs Integer, ByValAs Integer, ByValAs Integer) As Boolean

' 指定された年月の最終日は指定された年月の日数と同じなんですよね。
Dim 指定された年月の最終日 As Integer = DateTime.DaysInMonth(年, 月)

Return (DateTime.MinValue.Day <= 日) AndAlso (日 <= 指定された年月の最終日)

End Function



End Class

ここで気になるのが、日として妥当だメソッドです。Publicなメソッドにしたので単体で呼ばれることを意識しなければいけない気がします。で、日が妥当かどうか判断するには年と月が必要になります。そうなるとやっぱり年と月を検証するわけですが、年か月が妥当で無い場合、例外を投げるべきなのでしょうか?それともReturn False でしょうか?
私の考えは例外を投げるべきです。ここでの日として妥当だメソッドは日を検証するメソッドであり、年や月が妥当で無い場合は日を検証出来ない状態(例外)だと思うからです。

なので、日として妥当だメソッドは、
Public Shared Function 日として妥当だ(ByValAs Integer, ByValAs Integer, ByValAs Integer) As Boolean

If Not 年として妥当だ(年) Then

Throw New ArgumentOutOfRangeException("年 が 1 未満か、9999 よりも大きい値です。")

End If

If Not 月として妥当だ(月) Then

Throw New ArgumentOutOfRangeException("月 が 1 未満か、12 よりも大きい値です。")

End If

' 指定された年月の最終日は指定された年月の日数と同じなんですよね。
Dim 指定された年月の最終日 As Integer = DateTime.DaysInMonth(年, 月)

Return (DateTime.MinValue.Day <= 日) AndAlso (日 <= 指定された年月の最終日)

End Function

のように実装します。ちなみに日付として妥当だメソッドは内部での各検証メソッドの呼び出しがこの順序である限り、この実装で例外が投げられることはありません。

皆様はどうなさっていますか?

参考にさせていただいたところ。

@IT:第2回 ソフトウェア開発をシンプルにする考え方のコツ

C# と VB.NET の入門サイト:正しい日付かどうかをチェックする (IsDate)

例外メッセージで数値決め打ちなのは見なかったことにする。