我应该在WebApi应用程序的较低层使用try / catch语句吗?

时间:2017-02-07 08:08:11

标签: c# .net asp.net-web-api exception-handling

我有一个代表用户存储的简单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全部工作吗?

2 个答案:

答案 0 :(得分:1)

您应该通过以下问题来应用try / catch块

  1. 你想要&#34;处理&#34;特定层的例外?它的意思是, 你想提供任何替代或任何日志记录等 异常发生?
  2. 你是唯一一个消费这一层的人吗?如果其他人可以使用您的BAL或DAL,他将如何知道您的BAL或DAL是否发生任何异常。
  3. 如果您在发生异常时不想在BAL / DAL中执行任何操作,则不应在此处使用try catch块。如果你想要外层应该处理异常,&#34; exception&#34;应该来到外层,外层应该有try / catch。

答案 1 :(得分:1)

我认为这主要是基于意见的,但如果您有设计需要,您应该只处理异常。记录是开发人员的需要。

我在你的一条评论中看到了你想要制作的#34;漂亮的错误信息&#34;。这完全是一种设计需求,但对于程序的UI层,因此您不应该处理BLL中的异常。 (嗯,真正的设计需求是你不希望你的程序在抛出的第一个异常时崩溃,但你明白了)

在同一主题上,我建议尽可能在最高层实施您的日志,这样您也可以记录格式正确的消息。

当然,如果必须,你可以随时尝试/捕获你的BLL,但是重新抛出一个新的异常,原始异常作为InnerException。