2011-04-14 2 views
1

J'essaie de résumer les résultats de System.Net.Mail.SmtpClient.Send en utilisant une énumération. C'est ainsi que je sais si je devrais réessayer d'envoyer l'email et j'espère empêcher des email en double étant envoyés.Déterminer le résultat System.Net.Mail.SmtpClient.Send

public enum MailSendStatus { 
    None, 
    Sent, 
    ErrorCannotSend, 
    TryAgain, 
    SentMaybe 
} 

J'ai pris toutes les exceptions de Send et de diviser les SmtpException.StatusCode s de http://msdn.microsoft.com/en-us/library/system.net.mail.smtpstatuscode(v=vs.80).aspx. La ventilation semble-t-elle correcte? Ou y a-t-il une meilleure façon de faire cela?

try { 
    smtp.Send(msg); 
} catch (ArgumentNullException e) { 
    return MailSendStatus.ErrorCannotSend; 
} catch (ObjectDisposedException e) { 
    return MailSendStatus.ErrorCannotSend; 
} catch (InvalidOperationException e) { 
    return MailSendStatus.ErrorCannotSend; 
} catch (SmtpFailedRecipientsException e) { 
    return MailSendStatus.ErrorCannotSend; 
} catch (SmtpException e) { 
    switch(e.StatusCode) { 
     case SmtpStatusCode.BadCommandSequence: 
     case SmtpStatusCode.MailboxNameNotAllowed: 
     case SmtpStatusCode.HelpMessage: 
     case SmtpStatusCode.SyntaxError: 
     case SmtpStatusCode.SystemStatus: 
      return MailSendStatus.ErrorCannotSend; 
     case SmtpStatusCode.CannotVerifyUserWillAttemptDelivery: 
     case SmtpStatusCode.UserNotLocalWillForward: 
      return MailSendStatus.SentMaybe; 
     case SmtpStatusCode.ClientNotPermitted: 
     case SmtpStatusCode.CommandNotImplemented: 
     case SmtpStatusCode.CommandParameterNotImplemented: 
     case SmtpStatusCode.CommandUnrecognized: 
     case SmtpStatusCode.ExceededStorageAllocation: 
     case SmtpStatusCode.GeneralFailure: 
     case SmtpStatusCode.InsufficientStorage: 
     case SmtpStatusCode.LocalErrorInProcessing: 
     case SmtpStatusCode.MailboxBusy: 
     case SmtpStatusCode.MailboxUnavailable: 
     case SmtpStatusCode.MustIssueStartTlsFirst: 
     case SmtpStatusCode.ServiceClosingTransmissionChannel: 
     case SmtpStatusCode.ServiceNotAvailable: 
     case SmtpStatusCode.ServiceReady: 
     case SmtpStatusCode.StartMailInput: 
     case SmtpStatusCode.TransactionFailed: 
     case SmtpStatusCode.UserNotLocalTryAlternatePath: 
      return MailSendStatus.TryAgain; 
     case SmtpStatusCode.Ok: 
      break; 
    } 
} catch (Exception e) { 
    return MailSendStatus.SentMaybe; 
} 
return MailSendStatus.Sent; 

Répondre

1
catch (ArgumentNullException e) { return MailSendStatus.ErrorCannotSend;} catch 
(ObjectDisposedException e) { return MailSendStatus.ErrorCannotSend;} catch 
(InvalidOperationException e) { return MailSendStatus.ErrorCannotSend; 

Je ne aime pas ça. ArgumentNull, ObjectDisposed sont des erreurs de programmation (comme InvalidOperation). Vous ne devez pas les décomposer en erreur SMTP mais les corriger. Pour cela, il est bon d'écraser le programme (et de sortir une trace de pile). Approche "échouer rapidement". Ne retenez pas les exceptions que vous ne savez pas gérer, et InvalidOperationException, ObjectDisposedException indiquent que quelque chose ne va pas avec l'état, ArbumentNullException est une erreur d'utilisation/ui.

+0

J'ai omis les instructions log pour plus de clarté, mais oui celles-ci devraient surtout être prises en développement. Je viens d'inclure toutes les exceptions sur la page msdn http://msdn.microsoft.com/en-us/library/swas0fwc.aspx – djeeg

+0

Je n'aime pas ça. Vraiment. Le problème est qu'il est très difficile d'attraper un vrai bourgeon plus bas. Je ne cache jamais les erreurs internes et je les veux aussi visibles que possible pour un nettoyage rapide. – TomTom

+0

si je supprime ces cas de l'arbre de capture, le générique '(Exception e)' se déclenchera, renvoyant un code d'état "peut-être envoyé", ce qui n'est pas correct, il était définitivement une erreur, je suppose que je pourrais relancer l'exception – djeeg

Questions connexes