Michael Valdes
Michael Valdes

Reputation: 21

Capturing an Exception Logger Error

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

Answers (1)

Sean Lange
Sean Lange

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

Related Questions