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

约瑟夫·卡兹曼

我有一个代表用户存储的简单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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该在我的应用程序内使用Facebook用户ID吗?

来自分类Dev

我应该在新应用程序中使用Postgres的bigserial记录吗?

来自分类Dev

我应该在基于Scala的Web应用程序中使用GAE + Lift吗?

来自分类Dev

我应该在angularjs应用程序中为HTML元素使用Ids吗

来自分类Dev

我应该在电子应用程序中使用上下文隔离吗

来自分类Dev

我应该在angularjs应用程序中为HTML元素使用Ids吗

来自分类Dev

我应该在电子应用程序中使用视口元吗?

来自分类Dev

我应该在我的Rails应用程序的生产中使用log_level:debug吗

来自分类Dev

我应该在客户端/服务器应用程序中使用套接字吗?

来自分类Dev

ASP Identity OAuth令牌-我应该在移动应用程序流中使用ValidateClientAuthentication()和Secret吗?

来自分类Dev

单页应用程序-我应该在服务器端使用MVC Framework吗?

来自分类Dev

我应该在无服务器应用程序中使用Express.js吗?

来自分类Dev

我应该在Web应用程序的用户管理中使用Postgres的角色系统吗?

来自分类Dev

我应该在断言中使用try-catch块吗

来自分类Dev

我应该在应用程序运行时保持连接的GoogleApiClient吗?

来自分类Dev

我应该在大型角度应用程序中实例化子模块吗?

来自分类Dev

我应该在应用程序前端遮盖数据库主键(ID)吗

来自分类Dev

我们应该在更新后处理重用代码应用程序吗?

来自分类Dev

我应该在每行日志中使用try-with-resources语句吗?

来自分类Dev

我应该在main(){}中使用#include语句吗?

来自分类Dev

我应该在main(){}中使用#include语句吗?

来自分类Dev

我可以在catch语句中使用Scanner吗

来自分类Dev

我应该在ASP .Net Core Web应用程序中提交我的wwwroot / lib文件夹吗

来自分类Dev

我应该在开放源代码应用程序中发布我的Spotify API密钥吗?

来自分类Dev

try 和 catch 是 if 之后的一个语句吗?

来自分类Dev

我应该在AWS S3上托管Web应用程序的静态内容吗

来自分类Dev

我应该在数据库中存储桌面应用程序的本地化数据吗?

来自分类Dev

我应该在MVC应用程序中缓存WindowsIdentity对象吗?如果是这样,最好的方法是什么?

来自分类Dev

我应该在MVC应用程序中缓存WindowsIdentity对象吗?如果是这样,最好的方法是什么?

Related 相关文章

  1. 1

    我应该在我的应用程序内使用Facebook用户ID吗?

  2. 2

    我应该在新应用程序中使用Postgres的bigserial记录吗?

  3. 3

    我应该在基于Scala的Web应用程序中使用GAE + Lift吗?

  4. 4

    我应该在angularjs应用程序中为HTML元素使用Ids吗

  5. 5

    我应该在电子应用程序中使用上下文隔离吗

  6. 6

    我应该在angularjs应用程序中为HTML元素使用Ids吗

  7. 7

    我应该在电子应用程序中使用视口元吗?

  8. 8

    我应该在我的Rails应用程序的生产中使用log_level:debug吗

  9. 9

    我应该在客户端/服务器应用程序中使用套接字吗?

  10. 10

    ASP Identity OAuth令牌-我应该在移动应用程序流中使用ValidateClientAuthentication()和Secret吗?

  11. 11

    单页应用程序-我应该在服务器端使用MVC Framework吗?

  12. 12

    我应该在无服务器应用程序中使用Express.js吗?

  13. 13

    我应该在Web应用程序的用户管理中使用Postgres的角色系统吗?

  14. 14

    我应该在断言中使用try-catch块吗

  15. 15

    我应该在应用程序运行时保持连接的GoogleApiClient吗?

  16. 16

    我应该在大型角度应用程序中实例化子模块吗?

  17. 17

    我应该在应用程序前端遮盖数据库主键(ID)吗

  18. 18

    我们应该在更新后处理重用代码应用程序吗?

  19. 19

    我应该在每行日志中使用try-with-resources语句吗?

  20. 20

    我应该在main(){}中使用#include语句吗?

  21. 21

    我应该在main(){}中使用#include语句吗?

  22. 22

    我可以在catch语句中使用Scanner吗

  23. 23

    我应该在ASP .Net Core Web应用程序中提交我的wwwroot / lib文件夹吗

  24. 24

    我应该在开放源代码应用程序中发布我的Spotify API密钥吗?

  25. 25

    try 和 catch 是 if 之后的一个语句吗?

  26. 26

    我应该在AWS S3上托管Web应用程序的静态内容吗

  27. 27

    我应该在数据库中存储桌面应用程序的本地化数据吗?

  28. 28

    我应该在MVC应用程序中缓存WindowsIdentity对象吗?如果是这样,最好的方法是什么?

  29. 29

    我应该在MVC应用程序中缓存WindowsIdentity对象吗?如果是这样,最好的方法是什么?

热门标签

归档