班级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不存在那么我会写一条记录。如果它存在,那么它就会被重新抛出。
答案 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;
所以你不会丢失你的堆栈跟踪