我有一个代表用户存储的简单WebApi应用程序。我有DAL和BLL层。我ExceptionFilters
用于异常处理。
public class HandleExceptionsAttribute : ExceptionFilterAttribute
{
private readonly ILogger logger;
public HandleExceptionsAttribute(ILogger logger)
{
this.logger = logger;
}
public override void OnException(HttpActionExecutedContext context)
{
logger.LogError(context.Exception);
}
}
它将我的异常写入日志文件。我应该在较低层(DAL,BLL)上使用try / catch语句吗?我得到了一个建议,以尽量减少“ try catch”子句。我认为我需要抛出异常,使它们不出现在控制器层上。因为我认为这意味着我应该在我的DAL层中使用try / catch语句。我应该向BLL层抛出异常,并向控制器层抛出异常。看起来像这样一个:
从层
public class UserRepository
{
public IEnumerable<User> GetAll()
{
IEnumerable<User> users;
try
{
users = context.GetUsers();
}
catch(SomeSpecificException specExc)
{
throw specExc;
}
catch(Exception exc)
{
throw exc;
}
}
}
BLL层
public class UserService
{
public IEnumerable<User> GetAllUsers()
{
IEnumerable<Users> users;
try
{
users = userRepository.GetAll();
}
catch(PreviousSpecificException specExc)
{
throw specExc;
}
catch(OneMoreSpecificException sExc)
{
throw sExc;
}
catch(Exception exc)
{
throw exc;
}
}
}
看起来不好。我可以拒绝使用我所有的try / catch语句,并给ExceptionFilters全部工作吗?
我认为这主要是基于意见的,但是只有在有设计需要的情况下,才应处理异常。日志记录是开发人员的需要。
我在您的评论之一中看到您要制作“漂亮的错误消息”。这完全是设计需求,但是对于程序的UI层,因此,您不应该在BLL中处理异常。(嗯,真正的设计需求是您不希望您的程序在引发的第一个异常时崩溃,但您明白了)
在同一主题上,我建议您尽可能在最高层上实现日志,以便您也可以记录格式正确的消息。
当然,如果需要,您总是可以尝试/捕获BLL,但是重新抛出一个新异常,将原始异常作为其InnerException。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句