gpt4 book ai didi

c# - 消除 C# catch 中的重复代码

转载 作者:太空宇宙 更新时间:2023-11-03 21:15:40 26 4
gpt4 key购买 nike

我的 C#6、.Net 4.6、Entity Framework 6 应用程序在这个基本模式上有很多方法:

try
{
using (Entities dbContext = new Entities())
{
// Some database stuff
}
}
catch (System.Data.Entity.Core.EntityException eEntCore)
{
// May occur if connection to DB fails
throw MyApplicationException("Cannot access data store (Entity Core Exception)", eEntCore);
}
catch (System.Data.Entity.Infrastructure.DbUpdateException eDbu)
{
throw MyApplicationException("Cannot access data store (Database Exception)", eDbu);
}
catch (System.Data.SqlClient.SqlException eSql)
{
// Usually occurs after a Referential Integrity error
throw MyApplicationException("Cannot access data store (Data Exception)", eSql);
}

这些异常是我目前发现的——可能还有更多。

我的问题是,如果出现另一种异常类型,我必须修改许多方法来添加新的异常。我试图用这个 catch block 集中错误处理:

catch (Exception e)
{
AnalyseException(e);
}

AnalyseException() 在哪里工作;它抛出 MyApplicationException 或原始(未知)异常。除了不保留堆栈跟踪之外,设计工作正常(并且它犯了捕获异常的严重错误)。

用户界面处理 MyApplicationException。我不想让它处理所有不同的 EF 和 SQL 异常类型。

我已尝试使用此 C#6 功能重新设计:

catch (Exception ex) when (AnalyseException(ex))

但我无法通过它来保留堆栈跟踪。有没有办法在没有大量重复代码的情况下保留堆栈跟踪?

最佳答案

我认为你这里有两个问题:

  1. 您捕获异常只是为了将它们包装在您自己的异常类型中。何必呢?
  2. 如果你试图捕获一个新的异常,你必须修改“几十个地方”。这意味着您有一个有漏洞的抽象并且您正在重复您的数据访问代码。

最好的解决方案是不要费心包装异常。当您可以用它做一些有用的事情时捕获异常。

第二个最佳解决方案是保持异常处理相同(老实说,我觉得这很好)并将数据访问逻辑封装在适当的接口(interface)后面。

关于c# - 消除 C# catch 中的重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34520327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com