C#异常:它是否具有唯一值/标识符

时间:2014-04-17 12:15:09

标签: c# exception exception-handling

班级Exception是否有唯一的ID或任何其他唯一修饰符(GUID,...)?

我在后端服务中记录生成的异常。但我的目标是只记录一次异常。

也许这里有一些例子: 该服务有3层:

DAL (SQL-Interaction)
        => Exception A occurs here and is being logged into the database

BL (BusinessLayer)
         => Exception A is passed to here but isn't being logged
         => Exception B is thrown here and is being logged into the table

Services (Service Interface)
         => Exception A is passed to here but isn't being logged
         => Exception B is passed to here but isn't being logged
...
Client-solutions

我当前的解决方案(我个人真的不喜欢):

  

我编写了一个自己的异常(继承自基类异常)。当第一次抛出任何异常时,它会被记录。然后它被投射到我自己的异常并重新抛出。数据库中记录了我自己的异常类型的异常

示例(这是伪代码)

DAL - Layer
     try{}
     catch (Exception e)
     {
          // log in database
          // log in logfile
          // Cast to OwnException
          // rethrown as OwnException
     }

BL - Layer
     try{}
     catch (OwnException e)
     {
          // log in logfile
          // rethrow e
     }
     catch (Exception e)
     {
          // log in database
          // log in logfile
          // Cast to OwnException
          // rethrow as OwnException
     }

更新:我实际需要的是Id / unique修饰符。我会扫描数据库中是否存在此ID。如果这个id不存在那么我会写一条记录。如果它存在,那么它就会被重新抛出。

2 个答案:

答案 0 :(得分:2)

您可以创建Exception并创建一个新的属性布尔值为“已记录”,当您将日志设置为“已记录”并在日志层中记录之前需要验证是否未记录。

public class YourException : ApplicationException
    {
        public YourException () { }

        public YourException (string message) : base(message) { }

        public YourException (string message, Exception innerException) : base(message, innerException) { }

        public bool LoggedInLogFile { get; set; }

        public bool LoggedInDataBase { get; set; }
    }

在您的DAL中:

 try{}
 catch (Exception e)
 {
      // log in database
      // log in logfile
      var ex = new YourException (e.Message);
      ex.LoggedInLogFile  = true;
      ex.LoggedInDataBase = true;
      throw ex;
 }

在您的服务层:

 try{}
     catch (YourException e)
     {
          if(!e.LoggedInLogFile)
              //Log in file
          if(!e.LoggedInDataBase)
              //Log in Database
     }

答案 1 :(得分:1)

我不会创建自己的自定义异常。我要做的是显式捕获我知道在DAL中可能发生的异常,例如SQLException。在BL捕获那里可能发生的特定异常,并让其余的异常向上传播。

您的BL和DAL不太可能需要记录相同的异常,将它们分开,以便每个异常捕获它们负责的集合,然后重新抛出它们,以便客户端UI可以捕获它们。

修改

忘记提及,确保当你重新使用时:

throw,

而不是:

throw ex;

所以你不会丢失你的堆栈跟踪