La solución es correcta. Lo que quizás no sea tan correcto es el uso de excepciones para tratar un error previsible.
El uso de excepciones carga mucho al programa, destruye el flujo normal del código y puede hacer que el código no sea fácilmente legible.
En el caso que nos ocupa, sería preferible hacer una simple comprobación y con un IF decidir si es correcto o no.
Código Delphi
[-]
if (StrToIntDef(dmGlobal.g_Mes), 0) > 0) then
begin
if (StrToInt(dmGlobal.g_Mes) <= 12) then
begin
if (DaysInMonth(StrToInt(Copy(dmGlobal.g_Periodo,1,4)), StrToInt(dmGlobal.g_Mes)) >= StrToInt(edtDia.Text)) then
wf_vch := EncodeDate(StrToInt(Copy(dmGlobal.g_Periodo,1,4)), StrToInt(dmGlobal.g_Mes), strtoint(edtDia.Text))
else
edtDia.SetFocus;
end;
end;
Y para ahorrarnos todo este trabajo, existe la función TryEncodeDate que nos devuelve en su último parámetro la fecha y verdadero o false si se pudo convertir correctamente.