2011-04-14 2 views
1

열거 형을 사용하여 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은 usage/ui 오류입니다.

+0

나는 명료성을 위해 로그 문을 생략했지만, 대부분 개발 중에 발견되어야한다. 나는 방금 msdn 페이지에 모든 예외를 포함했다. http://msdn.microsoft.com/en-us/library/swas0fwc.aspx – djeeg

+0

나는 그다지 좋아하지 않는다. 정말. 문제는 더 이상 실제 버드를 잡는 것이 매우 어렵다는 것입니다. 나는 내부 오류를 숨기지 않으며 빠른 정리를 위해 가능한 한 눈에 띄기를 원합니다. – TomTom

+0

catch 트리에서 해당 사례를 제거하면 generic ('Exception e)'이 트리거되어 "상태가 전송되었을 수 있습니다"상태 코드가 반환됩니다. 올바르지 않습니다. 오류가 발생했습니다. 다시 throw 할 수 있습니다. 예외 – djeeg