我有一个代表用户存储的简单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语句吗?我得到了一个建议,以尽量减少"尝试捕获"条款尽可能多。我认为我不需要在控制器的图层上显示异常。我认为这意味着我应该在我的DAL层中使用try / catch语句。我应该将BLL图层的异常放到一起,并将控件的图层中的异常放到一边。它看起来像这样:
DAL图层
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全部工作吗?
答案 0 :(得分:1)
您应该通过以下问题来应用try / catch块
如果您在发生异常时不想在BAL / DAL中执行任何操作,则不应在此处使用try catch块。如果你想要外层应该处理异常,&#34; exception&#34;应该来到外层,外层应该有try / catch。
答案 1 :(得分:1)
我认为这主要是基于意见的,但如果您有设计需要,您应该只处理异常。记录是开发人员的需要。
我在你的一条评论中看到了你想要制作的#34;漂亮的错误信息&#34;。这完全是一种设计需求,但对于程序的UI层,因此您不应该处理BLL中的异常。 (嗯,真正的设计需求是你不希望你的程序在抛出的第一个异常时崩溃,但你明白了)
在同一主题上,我建议尽可能在最高层实施您的日志,这样您也可以记录格式正确的消息。
当然,如果必须,你可以随时尝试/捕获你的BLL,但是重新抛出一个新的异常,原始异常作为InnerException。