2011-04-14 97 views
1

我想用enum来总结System.Net.Mail.SmtpClient.Send的结果。这是我知道我是否应该重试发送电子邮件,并希望阻止发送重复的电子邮件。确定System.Net.Mail.SmtpClient.Send结果

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

我捉住了所有从Send异常和http://msdn.microsoft.com/en-us/library/system.net.mail.smtpstatuscode(v=vs.80).aspx打出SmtpException.StatusCode秒。故障看起来是否正确?还是有更好的方法来做到这一点?

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; 

回答

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

我不喜欢这样。 ArgumentNull,ObjectDisposed是编程错误(与InvalidOperation一样)。你不应该把它们分解为一个SMTP错误,但要修复它们。 Fpr这个,崩溃的程序是好的(并放出一个堆栈跟踪)。方法“快速失败”。不要重新抛出你不知道如何处理的异常,并且InvalidOperationException,ObjectDisposedException指示状态有问题,ArbumentNullException是一个用法/ ui错误。

+0

为了清楚起见,我已经省略了日志语句,但是这些应该大部分都是在开发过程中发现的。我只是在msdn页面上包含了所有的异常http://msdn.microsoft.com/en-us/library/swas0fwc.aspx – djeeg 2011-04-14 05:45:20

+0

我不喜欢那样。真。问题在于,它使得很难进一步发现真正的萌芽。我从不隐藏内部错误,并希望它们尽可能清晰可见,以便进行快速清理。 – TomTom 2011-04-14 05:46:14

+0

如果我从catch树中删除这些情况,泛型'(Exception e)'将触发,返回一个“可能已发送”状态码,这是不正确的,这是一个错误,我想我可以重新抛出例外 – djeeg 2011-04-14 05:53:44