0
我正在创建一个将异常记录到SQL Server数据库的错误日志应用程序。我希望完成的任务是能够在错误日志记录应用程序本身中捕获错误,如果错误日志应用程序发生并且通过电子邮件发送该信息。我正在使用不同的库进行电子邮件发送,但这不是问题,但是我无法捕获应用程序本身中的错误并将其返回给调用者。如果我能得到一些很棒的建议。捕获异常记录器错误
这是主代码:
public long LogError(ApplicationErrorLog error)
{
try
{
}
catch
{
}
return sp_Insert_ErrorLog(error);
}
private long sp_Insert_ErrorLog(ApplicationErrorLog error)
{
try
{
var application = new SqlParameter("@Application", error.Application);
var objectId = new SqlParameter("@ObjectId", error.ObjectId);
var exceptionMessage = new SqlParameter("@ExceptionMessage", error.ExceptionMessage);
var stackTrace = new SqlParameter("@StackTrace", error.StackTrace);
var innerExceptions = (error.InnerException != null)
? GetInnerExceptions(error.InnerException)
: string.Empty;
var innerException = new SqlParameter("@InnerException", innerExceptions);
var createdBy = new SqlParameter("@CreatedBy", error.CreatedBy);
var date = new SqlParameter("@CreatedDatetime", error.CreatedDateTime);
var returnCode = new SqlParameter("@ReturnVal", SqlDbType.BigInt)
{
Direction = ParameterDirection.Output
};
var parameters = new List<SqlParameter>()
{
application,
objectId,
exceptionMessage,
stackTrace,
innerException,
createdBy,
date,
returnCode
};
Database.SqlQuery<object>("exec @ReturnVal = sp_Insert_ErrorLog @Application, @ObjectId, @ExceptionMessage, @StackTrace, @InnerException, @CreatedBy, @CreatedDatetime", parameters.ToArray()).FirstOrDefault();
returnCode.ToString();
return (int)returnCode.Value;
}
catch (Exception ex)
{
return 0;
}
}
,这是主叫方:
private void button1_Click(object sender, EventArgs e)
{
try
{
throw new ApplicationException("Throw error");
}
catch (Exception ex)
{
var conn = ConfigurationManager.ConnectionStrings["ErrorLogger"].ConnectionString;
using (var log = new ErrorLogger("ErrorLogger"))
{
var error = new ApplicationErrorLog()
{
ObjectId = ex.Source,
StackTrace = ex.StackTrace,
Application = "Test",
CreatedBy = "Mike",
CreatedDateTime = DateTime.Now,
ExceptionMessage = ex.Message,
InnerException = ex.InnerException
};
var errId = log.LogError(error);
MessageBox.Show("Error:" + errId.ToString());
};
}
}
将调用移至try中的sp_Insert_ErrorLog方法。你应该考虑从sp_改变你的前缀,甚至更好的是没有前缀。该前缀可能会导致一些问题。 https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –
好吧,然后我的捕获将简单地“catch(Exception ex){return 0;}”返回错误,如果它来自应用本身? @SeanLange –
您的捕获将有逻辑发送您的电子邮件。但是你应该删除正在做这项工作的方法的try catch,因为这是你想要冒出的异常。或者,您可以添加逻辑来发送电子邮件,忘记您的新方法。 –