C# 捕获异常记录器错误
我正在创建一个错误日志应用程序,用于记录SQL Server数据库的异常。我希望完成的任务是能够捕获错误日志应用程序本身中发生的错误,并将该信息发送到电子邮件中。我正在使用不同的库发送电子邮件,这不是问题,但是我在捕获应用程序本身的错误并将其返回给调用方时遇到了问题。如果我能得到一些建议,那就太棒了 这是主代码:C# 捕获异常记录器错误,c#,sql-server,logging,error-handling,C#,Sql Server,Logging,Error Handling,我正在创建一个错误日志应用程序,用于记录SQL Server数据库的异常。我希望完成的任务是能够捕获错误日志应用程序本身中发生的错误,并将该信息发送到电子邮件中。我正在使用不同的库发送电子邮件,这不是问题,但是我在捕获应用程序本身的错误并将其返回给调用方时遇到了问题。如果我能得到一些建议,那就太棒了 这是主代码: public long LogError(ApplicationErrorLog error) { try { }
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());
};
}
}
下面是我可能会如何把这些放在一起
public long LogError(ApplicationErrorLog error)
{
try
{
return InsertErrorLog(error);
}
catch(Exception ex)
{
//Do some stuff here to send your email
return 0;
}
}
private long InsertErrorLog(ApplicationErrorLog error)
{
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;
}
公共长日志错误(ApplicationErrorLog错误)
{
尝试
{
返回InsertErrorLog(错误);
}
捕获(例外情况除外)
{
//在这里做一些事情来发送你的电子邮件
返回0;
}
}
专用长插入错误日志(ApplicationErrorLog错误)
{
var application=new-SqlParameter(“@application”,error.application);
var objectId=新的SqlParameter(“@objectId”,error.objectId);
var exceptionMessage=new-SqlParameter(“@exceptionMessage”,error.exceptionMessage);
var stackTrace=新的SqlParameter(“@stackTrace”,error.stackTrace);
var InnerException=(error.InnerException!=null)
?GetInnerException(错误。InnerException)
:string.Empty;
var innerException=新的SqlParameter(“@innerException”,innerException);
var createdBy=new-SqlParameter(“@createdBy”,error.createdBy);
var date=新的SqlParameter(“@CreatedDatetime”,error.CreatedDatetime);
var returnCode=新的SqlParameter(“@ReturnVal”,SqlDbType.BigInt)
{
方向=参数方向。输出
};
var参数=新列表()
{
应用
目标,
例外消息,
stackTrace,
内部例外,
由,
日期,
返回码
};
Database.SqlQuery(“exec@ReturnVal=sp_Insert\u ErrorLog@Application,@ObjectId,@ExceptionMessage,@StackTrace,@InnerException,@CreatedBy,@CreatedDatetime”,parameters.ToArray()).FirstOrDefault();
returnCode.ToString();
return(int)returnCode.Value;
}
将调用移动到try中的sp\u Insert\u ErrorLog方法。你应该考虑把你的前缀从SPY改变,甚至更不用说前缀。该前缀可能会导致一些问题。好的,然后我的catch将是“catch(Exception ex){return 0;}”,如果错误来自应用程序本身,则返回错误@SeanLange您的捕获将具有发送电子邮件的逻辑。但是您应该删除正在进行工作的方法上的try-catch,因为这是您现在想要冒泡的异常。或者,您可以为发送电子邮件的捕获添加逻辑,忘记您的新方法。