Esto es ¡la manera apropiada de manejar excepciones!
En general, no se debe manejar una excepción a menos que se pueda corregir el problema, y solo se debe manejar en un lugar donde se pueda aplicar la corrección.
Por ejemplo, la persona que llama de su código puede querer solicitarle al usuario que corrija la dirección de correo electrónico incorrecta. Pero su código no puede saber la forma correcta de solicitarlo. ¿Te llaman desde WinForms o formularios web? ¿Cómo debería ser el cuadro de diálogo? ¿Debería haber en un cuadro de diálogo? Estas son cosas que solo puede conocer la persona que llama de su método y no su propio método.
En la persona que llama:
try
{
SendEmail(SenderEmail, SenderDisplayName, RecipientEmails, Subject, Message);
}
catch (MyMailAddressException ex)
{
MessageBox.Show(ex.Message);
}
Tenga en cuenta que más excepciones que se propagarán a MyMailAddressException
código que sabe cómo manejarlos.
Nivel adecuado de "manipulación" en su método:
public enum MailAddressType
{
Sender,
Recipient
}
public class MyMailAddressException : Exception
{
public MailAddressType AddressType { get; set; }
public string EmailAddress { get; set; }
public MyMailAddressException(
string message,
MailAddressType addressType,
string emailAddress,
Exception innerException) : base(message, innerException)
{
AddressType = addressType;
EmailAddress = emailAddress;
}
}
public void SendEmail(
string senderEmail,
string senderDisplayName,
IEnumerable<string> recipientEmails,
string subject,
string message)
{
using (
var mailMessage = new MailMessage
{
Subject = subject,
Body = message
})
{
try
{
mailMessage.From = new MailAddress(
senderEmail, senderDisplayName);
}
catch (FormatException ex)
{
throw new MyMailAddressException(
"Invalid from address", MailAddressType.Sender,
senderEmail, ex);
}
foreach (var recipient in recipientEmails)
{
try
{
mailMessage.To.Add(recipient);
}
catch (FormatException ex)
{
throw new MyMailAddressException(
"Invalid to address", MailAddressType.Recipient,
recipient, ex);
}
}
var smtpClient = new SmtpClient("192.168.168.182");
smtpClient.Send(mailMessage);
}
}
La persona que llama puede entonces coger MyMailAddressException
y tener toda la información necesaria para indicar al usuario qué se debe corregir. Otras excepciones deberían propagarse.
Mis ediciones anteriores han respondido a su pregunta sobre el método. He estado asumiendo que su aplicación tiene un manejo de excepciones de nivel superior apropiado. Gabriel me señala que si tuvieras el manejo de excepciones de nivel superior apropiado, ¡entonces tu aplicación no fallaría!
Sin embargo, colisionar no es necesariamente algo malo. Si ocurre algo que su código no puede manejar, entonces es correcto hacer un bloqueo. La alternativa es tratar de seguir funcionando, con la esperanza de que esta excepción no controlada no haya dañado su programa de tal manera que empiece a producir resultados incorrectos.
Los detalles de dónde colocar exactamente los "controladores de nivel superior" dependen de su programa. Por ejemplo, es diferente entre WinForms y aplicaciones ASP.NET. Sin embargo, el concepto será el mismo: registrar de forma segura toda la información disponible, luego permitir que la excepción se propague y bloquee la aplicación.
Por supuesto, debe utilizar los bloques finally
para limpiar su aplicación, incluso en presencia de excepciones.
No, no lo estoy ignorando. ¿Viste de dónde hablo para que el usuario corrija la dirección de correo electrónico incorrecta? Eso es manejar la excepción. –
No, ya que este es un método de utilidad de nivel inferior, las excepciones definitivamente no deberían manejarse aquí. Déjalo en manos de quienes llaman. –
@Jon: No, su párrafo central resume perfectamente la forma en que se pretendía utilizar las excepciones: si se puede tratar el problema. –