包装和重新抛出异常会影响性能吗?

Bil*_*lla 10 c# asp.net-mvc exception-handling asp.net-mvc-3

我在我的应用程序中遵循这种处理异常的方式.但我的领导说我做错了.我只是包装和重新抛出相同的异常,这将影响性能.

我的做法有什么问题?有没有人对我如何在这里记录和处理异常有任何建议?

public class BusinessRepository : IBusinessRepo
{
    public List<Employee> GetEmployees()
    {
        try
        {
            //do some DB operations
        }
        catch (SQLException sqlex)
        {
            Logger.Log("Exception detail with full stack trace");
            throw new DALException(sqlex, "Error in data access layer");
        }

    }
}
public class BusinessLayerClass : IBusinessLayer
{
    private readonly IBusinessRepo Repo;
    public BusinessLayerClass(IBusinessRepo rep)
    {
        Repo = rep;
    }
    public List<Employee> GetEmployees()
    {
        try
        {
           List<Employee> emps= return Repo.GetEmployees();
        }
        catch (DALException dex)
        {
            //do nothin as it got already logged
            throw;
        }
        catch (Exception ex)
        {
            Logger.Log(ex, "Business layer ex");
            throw new BusinessLayerEx(ex);
        }
    }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        try
        {
            List < Employee >= BusinessLayerClass.GetEmployees();

        }
        catch (DALException)
        {
            //show error msg to user
        }
        catch (BusinessLayerEx)
        {
            //show error msg to user
        }
        catch (Exception ex)
        {
            Logger.Log();
            //show error msg to user
        }
        return View(emps);
    }
 }
Run Code Online (Sandbox Code Playgroud)

我是否遵循上面显示的正确的冒泡和处理方式?

yoo*_*er8 3

我倾向于同意你的做法,只要满足两个条件:

  1. 您的Logger.Log语句记录的内容比您在此处指示的内容更有意义/有用(我猜您的代码此处只是指示记录错误的示例消息)。如果它提供了可用于追踪异常原因的信息,那就太好了。
  2. 您的//show error msg to user评论意味着在该位置,您将呈现一个很好的视图,解释发生了错误,并且您不只是显示默认的异常屏幕/跟踪跟踪。

至于throw;当你捕获刚刚抛出的 DALException 时:那很好。您这里的目标似乎是捕获来自前一层的任何异常并记录它,然后抛出您自己的异常。由于只有在您已经记录了另一个错误并自己抛出它时才会抛出 DALException,因此让它冒泡超过此级别是完全可以的。