【问题标题】:How to email error msg in catch如何在 catch 中通过电子邮件发送错误消息
【发布时间】:2011-02-14 11:01:34
【问题描述】:

我有下面的代码,我现在需要弄清楚如何不仅显示而且将其全部通过电子邮件发送到我的电子邮件,这样如果任何用户遇到错误,我们就可以确切地看到它是什么。

Catch ex As Exception
      lblInformation.Text = ("<h4>Unable to save data in database</h4>" + vbNewLine + "The error was '" + ex.Message + "'" + vbNewLine + vbNewLine + "The SQL Command which falied was:" + vbNewLine + "<strong>" + mySQL + "</strong>" + vbNewLine + "Please contact the Service Desk to report this error.").Replace(vbNewLine, "<br />" + vbNewLine)
      booInsertedRecord = False
Finally
      myConnection.Close()
End Try

我尝试插入

SmtpMail.Send(objEMail)

在“booInsertedRecord = False”上方的新行中,然后创建一个新的“Dim objEMail New MailMessage()”,但后来意识到这不起作用,因为它的 msg 是在 catch 中定义的,所以不确定接下来的步骤拿走。

自从我使用 VB 以来已经有一段时间了,那时我不需要使用类似的东西,所以非常感谢任何帮助。

编辑 - @tzup ToString() 显示

[The error was 'System.Data.SqlClient.SqlException: The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value.
The statement has been terminated.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async)
at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe)
at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
at ASP.bulletinform_aspx.Upload_Click(Object source, EventArgs e) in E:\Bulletin\Bulletin\Bulletin\BulletinForm.aspx:line 415']

如果我有空格,我会把它放在评论中,第 415 行是myUpdate.ExecuteNonQuery()

【问题讨论】:

  • @DavidePiras 为什么要删除 VS08 标签?这是一个 VS08 项目,我希望不必升级,所以不包括该标签相关吗?
  • 不,因为我们这里的问题和答案不依赖(也没有链接)VS 2008 的任何特定功能,如果您使用的是 VS 2003 / 2005 甚至 2010,所有答案都会一直是一样的。我们使用标签来强调该问题与 .NET Framework、VS 或其他任何版本的某个版本严格相关,如果是另一个版本,答案可能会有所不同,这不是这个问题的情况:)
  • @DavidePiras 啊,好吧,我不确定是否有任何问题,所以为了安全起见,我添加了这个

标签: asp.net vb.net


【解决方案1】:

【讨论】:

  • 酷,忘了 log4net 的这个功能。
【解决方案2】:

很久以前,Jeff Atwood 创建了一个用户友好的异常处理程序。我使用它,因为:) http://www.codinghorror.com/blog/2004/06/user-friendly-exception-handling.html

它允许您通过电子邮件发送错误,甚至包括异常发生时的 PC 屏幕截图。

【讨论】:

  • 好吧,阅读了大约一半的页面,我认为这可能只是解决我的问题的复杂或扩展解决方案,如果我必须在单个页面之外进行任何形式的编码,我必须这样做继续工作,然后我可能需要升级项目,这可能会导致地狱并完全破坏它,但要调查它是否会是这种情况,或者它是否是一个完美的解决方案。
  • 从浏览代码来看,我已经改变太多或影响系统的大部分,所以看起来我需要关注 tzup 的想法,即使用 tryparse 来检查每个字段是否是有效,如果我可以完全正常工作,那么如果有任何原因导致错误,那将为我提供准确的字段。
  • 嗯,这是任何未处理异常的“顶级处理程序”。所以实际上你不必编写任何代码。安装后(添加引用并调整 app/web.config),您只需在代码中保留未处理的异常,ExHandler 会通知您,还会显示漂亮的消息等。
【解决方案3】:

在 catch 块中创建电子邮件对象,例如将内容设置为 lblInformation.Text,然后发送。

应该可以。

为电子邮件发送功能创建一个静态类,例如一个以字符串为参数的静态函数。在 util 程序集中定义此类,在项目中引用此程序集,然后在需要时在您的 catch 语句中调用它(如果您愿意)。

你的班级可能是: EmailUtil.SendMail(string msg);

然后您的 SendMail 函数从配置中读取一些参数(smtp 服务器、登录等),然后发送电子邮件。

除此之外,log4net 非常擅长处理这种情况,只要你正确配置它(我认为这不是一个非常陡峭的学习曲线)

祝你好运!

编辑

这是一个使用 TryParse

进行数据验证的示例
string someTextVal = "3";
string someDateVal = "14.02.2011";

int i;
if (!int.TryParse(someTextVal, out i))
{
   throw new Exception("Error trying to convert value=" + someTextVal + " to an int");
}
// Now i holds a validated integer

DateTime dt;
if (!DateTime.TryParse(someDateVal, out dt))
{
   throw new Exception("Error trying to convert value=" + someDateVal + " to a datetime");
}
// Now dt holds a validated date

注意日期时间验证可能需要一些柚木,具体取决于输入的呈现方式

后期编辑如果有人需要在 VB 中转换我的 C# 代码(因为问题是用 VB 标记的),这里有一个在线转换器的链接:Convert C# to VB.NET

【讨论】:

  • 这应该可行,但我们每次都在重新发明轮子......如果真的必须在没有任何日志记录库的情况下完成,那么我至少会创建一个 Logger 类,调用它传递异常并从那里发送电子邮件,以避免在应用程序的所有捕获中复制粘贴太多代码。
  • 我没有期待快速响应并尝试按照您最终所说的进行设置“objEMail.Body = ("

    无法将数据保存在数据库中

    " + vbNewLine + "错误是 '" + ex.Message + "'" + vbNewLine + vbNewLine + "失败的 SQL 命令是:" + vbNewLine + "" + mySQL + "" + vbNewLine + "请联系服务台报告此错误。").Replace(vbNewLine, "
    " + vbNewLine)" 我现在唯一的问题是我是否能够更准确地获取错误消息它在哪个字段上失败 ["The error was '" + ex.Message + ] 是该部分...
  • 它会显示 [错误是'将 char 数据类型转换为日期时间数据类型导致超出范围的日期时间值。] 我知道这次导致的字段该错误称为 [DateOfBirth],但有许多“日期时间”字段,因此您知道如何进一步细化错误消息以准确指定哪些字段存在问题吗?
  • 实际上,不要通过电子邮件发送 ex.Message,而是使用 ex.ToString()。这将为您提供有关异常的更多信息。此外,我会使用 StringBuilder 对象来构建消息(它的性能更好,生成的代码更具可读性)。
  • @tzup 在我的问题中添加了现在显示的确切内容,但如果您认为这会告诉我导致错误的确切字段名称,我将如何设置 StringBuilder 对象?
【解决方案4】:

通常有日志系统可以执行此操作,因此您无需重新发明轮子,也无需在代码中的 catch 块中添加任何逻辑。

您可以查看 Log4Net 和 Microsoft Logging Enterprise Libraries,我个人更喜欢并使用 Log4Net,在您的 catch 块中,您只需使用 Logger.LogError(exception) 之类的东西,具体取决于您在应用程序中的配置方式。配置您将所有内容记录在数据库和/或事件日志中和/或通过电子邮件和/或文本文件等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多