Reputation: 21
I am creating an error log application that logs exceptions to a SQL Server DB. The tasks I wish to accomplish is be able to capture an error in the error logging application itself if it occurs and have that information sent in an email. I am using a different library for the emailing which isn't an issue, however I am having trouble capturing the error in the application itself and returning it to the caller. If I could get some suggestions that would be fantastic.
This is the main code:
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;
}
}
and this is the caller:
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());
};
}
}
Upvotes: 0
Views: 333
Reputation: 33581
Here is how I would likely put this together.
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;
}
Upvotes: 1