我有以下代码
try
{
if (!bDebug)
smtp.Send(m);
}
catch (Exception e)
{
wl("Meldingen kunne ikke sendes til en eller flere mottakere.", ConsoleColor.Red);
wl(e.Message, ConsoleColor.DarkRed);
using (var errorfile = System.IO.File.CreateText("error-" + DateTime.Now.Ticks + ".txt"))
{
errorfile.WriteLine(e.StackTrace);
if (e.GetType() == typeof(SmtpFailedRecipientException))
{
var se = (SmtpFailedRecipientException) e;
errorfile.WriteLine(se.FailedRecipient);
}
errorfile.WriteLine(e.ToString());
}
}
其中wl
是使用颜色写入控制台的快捷方式,第一行中的文字显示“消息无法发送给一个或多个收件人。
之前我只抓住了SmtpFailedRecipientException
,但是当它开始在其他一些步骤中失败时,我将通用Exception
推到了那里。所以我想知道的部分是我将Exception对象转换为更具体的对象来获取FailedRecipient
属性。可以/应该以另一种更恰当的方式完成吗?看起来有点笨拙......
答案 0 :(得分:8)
您可以拥有多个catch分支:
catch (SmtpFailedRecipientException se)
{
using (var errorfile = System.IO.File.CreateText("error-" + DateTime.Now.Ticks + ".txt"))
{
errorfile.WriteLine(se.StackTrace);
// variable se is already the right type, so no need to cast it
errorfile.WriteLine(se.FailedRecipient);
errorfile.WriteLine(se.ToString());
}
}
catch (Exception e)
{
wl("Meldingen kunne ikke sendes til en eller flere mottakere.", ConsoleColor.Red);
wl(e.Message, ConsoleColor.DarkRed);
// for other error types just write the info without the FailedRecipient
using (var errorfile = System.IO.File.CreateText("error-" + DateTime.Now.Ticks + ".txt"))
{
errorfile.WriteLine(e.StackTrace);
errorfile.WriteLine(e.ToString());
}
}
答案 1 :(得分:4)
您可以尝试这样的事情(source):
我们将学习如何捕捉/处理不同类型的 使用时发送电子邮件时可能发生的异常/错误 ASP.Net。我们将使用不同的方法实现错误/异常处理
System.Net.Mail
中提供的异常类。首先了解如何使用ASP.Net发送电子邮件访问this link。请注意,在上面的文章中(通过链接引导) 'SendEmails'只捕获一个通用异常,以防ASP.Net 发送电子邮件时遇到错误就像是“发送” 电子邮件失败等'。我们将扩展错误处理功能 上面的文章。因此,让我们开始解决我们的解决方案 以前创建的。我们已经放了一个抓住的try-catch块 一个通用的例外,几乎没有说明可能会发生什么 错误。让我们马上捕捉不同类型的例外:
抓住
SmtpException
:SmtpException
类有一个属性 'StatusCode
'实际上是一个获取的枚举 电子邮件时SMTP服务器返回的错误/异常代码值 消息被传输。它还提供了更多细节 电子邮件发送过程中可能发生的错误/异常。例如catch (SmtpException smtpException) { // You can put a switch block to check for different exceptions or errors // To checks if the destination mailbox is busy if (smtpException.StatusCode == SmtpStatusCode.MailboxBusy) throw smtpException; // To check if the client is authenticated or is allowed to send email using the specified SMTP host if (smtpException.StatusCode == SmtpStatusCode.ClientNotPermitted) throw smtpException; // The following code checks if the email message is too large to be stored in destination mailbox if (smtpException.StatusCode == SmtpStatusCode.ExceededStorageAllocation) throw smtpException; // To check if the email was successfully sent to the SMTP service if (smtpException.StatusCode == SmtpStatusCode.Ok) throw smtpException; // When the SMTP host is not found check for the following value if (smtpException.StatusCode == SmtpStatusCode.GeneralFailure) throw smtpException; }
抓住
SmtpFailedRecipientException
:TheSmtpFailedRecipientException
类处理与之相关的异常 电子邮件的收件人,例如SMTP无法发送电子邮件 收件人。SmtpFailedRecipientException
发生在SmtpClient
无法完成SmtpClient.Send()
或SmtpClient.SendAsync()
对特定收件人的操作。要捕获此异常,请使用 以下代码:catch (System.Net.Mail.SmtpFailedRecipientException smtpFailedRecipientException) { // Get the email that is causing email sending failed exception String emailCausingException = smtpFailedRecipientException.FailedRecipient; // Get the status code why and what is actually causing an email sending error System.Net.Mail.SmtpStatusCode statusCode = smtpFailedRecipientException.StatusCode; // Take some action either re-send the email again or do some error handling code here }
抓住
SmtpFailedRecipientsException
:TheSmtpFailedRecipientsException
实际上是一个集合SmtpFailedRecipientException
个用于同一目的的对象。它是 用于在SmtpClient
无法发送电子邮件时处理异常 一个或多个收件人。catch (System.Net.Mail.SmtpFailedRecipientsException smtpFailedRecipientsException) { ArrayList emailCausingException = new ArrayList(); foreach (SmtpFailedRecipientException smtpFailedRecipientException in smtpFailedRecipientsException.InnerExceptions) { // Get the email that is causing email sending failed exception // Add it to a list of emails with exceptions emailCausingException.Add(smtpFailedRecipientException.FailedRecipient); // Get the status code why and what is actually causing an email sending error System.Net.Mail.SmtpStatusCode statusCode = smtpFailedRecipientException.StatusCode; // Take some action either re-send the email again or do some error handling // You can also log or print this status code for an individual recipient here if (statusCode == SmtpStatusCode.MailboxBusy) { //Re-Send email after some time System.Threading.Thread.Sleep(1000); //smtpClient.Send(); //Email sending code here } } }