by Mike Hofe » Fri, 19 May 2006 23:26:25
Hi guys,
Long ago, I learned that it was a bad idea to throw exceptions inside a
constructor. For instance:
Public Class OutCountMovementArgs
Private innerDirection As OutCountDirection
Private innerStartDate As Date
Private innerEndDate As Date
Public Sub New(ByVal direction As OutCountDirection, _
ByVal startDate As Date, _
ByVal endDate As Date)
If startDate < #10/1/2004# Or startDate > Today Then
Throw New DateOutOfRangeException("startDate")
End If
If endDate < #10/1/2004# Or endDate > Today Then
Throw New DateOutOfRangeException("endDate")
End If
If startDate > endDate Then
Throw New DateRangeOutOfOrderException
End If
innerDirection = direction
innerStartDate = startDate
innerEndDate = endDate
End Sub
Public ReadOnly Property Direction As OutCountDirection
Get
Return innerDirection
End Get
End Property
Public ReadOnly Property StartDate As Date
Get
Return innerStartDate
End Get
End Property
Public ReadOnly Property EndDate As Date
Get
Return innerEndDate
End Get
End Property
End Class
Is this still considered a bad idea? My gut tells me that it is, as a
lot of users tend to write variable initialization code outside of
Try-Catch blocks, like this:
Dim myStartDate As Date
Dim myEndDate As Date = Today
Dim args As New OutCountArgs(OutCountDirection.Into, myStartDate,
myEndDate)
Try
.
.
.
Catch...
End Try
The example above will fail (because myStartDate defaults to 1/1/1900),
resulting in a DateOutOfRangeException which isn't caught by the
Try...Catch handler, and surprises the developer. I, myself, try to
avoid that, but occasionally get caught by it myself. To code the class
the other way makes for very wordy code because you have to to
explicitly initialize every property (although that tends to be very
clear).
In general, how do you handle this? My inclination is to err on the
side of caution. I'm coding in a vaccuum here (only developer in the
entire company now for 2 years), so I have no one with whom to discuss
these kinds of issues, and I'm a little out of touch with the
community.
Any input is greatly appreciated!