You can use the RegularExpressionValidator, see code at the end.
As curt says, you can use try and catch but trying and catching is very
expesive as it uses lots of CPU time.
I ran Parse 5000 times and passed an invalid date, it took about 30 secons,
I ran it 5000 times on an valid date and it took less than 1 second. I
always run my system with Catch ALL handled errors to find any problems with
people using catch instend of checking for object being null ect.
(Code, this is SNIPS from a project that i am working on, so bits maybe
missing)
RegularExpressionValidator dateValidator;
dateValidator = new RegularExpressionValidator();
dateValidator.ControlToValidate = dateBox.ID;
dateValidator.Display = ValidatorDisplay.Dynamic;
dateValidator.ValidationExpression =
"^(?

?:0?[1-9]|1[0-2])(\\/|-)(?:0?[1-9]|1\\d|2[0-8]))(\\/|-)(?:[1-9]\\d\\d\
\d|\\d[1-9]\\d\\d|\\d\\d[1-9]\\d|\\d\\d\\d[1-9])$|^(?

?:0?[13578]|1[02])(?:
31(\\/|-))|(?

?:0?[1,3-9]|1[0-2])(\\/|-)(?:29|30)))(\\/|-)(?:[1-9]\\d\\d\\d
|\\d[1-9]\\d\\d|\\d\\d[1-9]\\d|\\d\\d\\d[1-9])$|^(0?2(\\/|-)29)(\\/|-)(?

?:
0[48]00|[13579][26]00|[2468][048]00)|(?:\\d\\d)?(?:0[48]|[2468][048]|[13579]
[26]))$ ";
dateValidator.ErrorMessage = "MM/DD/YYYY";