2017-07-31 74 views
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()); 
       }; 
      } 

    } 
+0

将调用移至try中的sp_Insert_ErrorLog方法。你应该考虑从sp_改变你的前缀,甚至更好的是没有前缀。该前缀可能会导致一些问题。 https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+0

好吧,然后我的捕获将简单地“catch(Exception ex){return 0;}”返回错误,如果它来自应用本身? @SeanLange –

+0

您的捕获将有逻辑发送您的电子邮件。但是你应该删除正在做这项工作的方法的try catch,因为这是你想要冒出的异常。或者,您可以添加逻辑来发送电子邮件,忘记您的新方法。 –

回答

1

这里是我很可能会将这一起。

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; 
} 
+0

好的真棒感谢您的帮助肖恩! –