SingleOrDefault异常处理

2024-06-01

我有一个示例代码,它调用 SingleOrDefault 方法 3 次,并在任何序列具有多个匹配元素时记录异常。

如果我想检查这段代码的哪一部分抛出异常,问题就开始了。

是否可以从此异常中获取一些有用的信息,例如谓词参数或集合类型以进行更详细的跟踪?

像这样 -序列包含多个匹配元素。集合 IEnumrable|ParamType|参数 {谓词参数 toString()}

 public void GetSingleOrDefaultTest(){

    try{

        var user = Users.SingleOrDefault(e => e.Id == 1);

        var profile = UserProfiles.SingleOrDefault(e => e.Id == 1);

        var profile2 = UserProfiles.SingleOrDefault(e => e.Id == 2);


    } catch(InvalidOperationException ex){
        Log(ex);
    }

}

如果您想知道哪个语句导致了错误,您必须单独检查它们。抓住InvalidOperationException在每一个SingleOrDefault调用并将其包装在一个新的异常中,您可以在其中填充附加信息。

try
{
    User user;
    UserProfile profile;
    UserProfile profile2;

    try
    {
        user = Users.SingleOrDefault(e => e.Id == 1);
    }
    catch (InvalidOperationException ex)
    {
        throw new InvalidOperationException("User lookup for Id = 1 failed", ex);
    }

    try
    {
        profile = UserProfiles.SingleOrDefault(e => e.Id == 1);
    }
    catch (InvalidOperationException ex)
    {
        throw new InvalidOperationException("User profile lookup for Id = 1 failed", ex);
    }

    try
    {
        profile2 = UserProfiles.SingleOrDefault(e => e.Id == 2);
    }
    catch (InvalidOperationException ex)
    {
        throw new InvalidOperationException("User profile lookup for Id = 2 failed", ex);
    }

    // work with user, profile and profile2
}
catch(InvalidOperationException ex)
{
    Log(ex);
}

Edit:

您还可以通过以下方式封装单个尝试捕获

private static T GetSingleOrDefault<T>(IEnumerable<T> collection, Expression<Func<T, bool>> predicate)
{
    try
    {
        return collection.SingleOrDefault(predicate.Compile());
    }
    catch (InvalidOperationException e)
    {
        var message = string.Format(
            "{0} (Collection: {1}, param: {2})",
            e.Message,
            collection.GetType(),
            predicate);

        throw new InvalidOperationException(message);
    }
}

这样你的代码看起来就像

try
{
    var user = GetSingleOrDefault(Users, e => e.Id == 1);

    var profile = GetSingleOrDefault(UserProfiles, e => e.Id == 1);

    var profile2 = GetSingleOrDefault(UserProfiles, e => e.Id == 2);

    // work with user, profile and profile2
}
catch(InvalidOperationException ex)
{
    Log(ex);
}

这会产生类似这样的消息

System.InvalidOperationException:序列包含多个匹配元素(集合:IEnumerable`1[User],参数:e => e.Id == 1)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SingleOrDefault异常处理 的相关文章

随机推荐

  • Node.js - 异步 JSON 查询

    如果这是一个愚蠢的问题 我深表歉意 但我对 Javascript 很陌生 而 Node js 确实让我很头疼 因为它是异步的 我的目标是从 API 查询 JSON 对象并能够使用它 我试图寻找关于我应该做什么的问题和答案 但它们对我来说都没
  • DateTime.Ticks 没有 100 ns 的分辨率? [复制]

    这个问题在这里已经有答案了 可能的重复 C DateTime Now 精度 https stackoverflow com questions 2143140 c sharp datetime now precision SO 有一些关于
  • Gridview,允许背景画布在视图之外绘制

    我正在开发一个 Android 应用程序 一个小型记事本应用程序 在我的应用程序中 我使用 Gridview 创建 2 X 大小的网格并在每个单元格中 我有一个 LinearLayout 调用 AbstractNote 它的任务是显示每个保
  • 如何在列表视图中按字母顺序显示联系人[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个自定义列表视图 我需要按字母顺序显示联系人 您可以提供示例代码吗 我该如何实现这一点 您可以按字
  • “as”关键字在内部如何工作?

    我知道这个关键字的功能 但我想知道它在较低级别上是如何工作的 哪一个更快 它们总是产生相同的结果吗 如果是的话 为什么有两种不同的方式 Is there an overhead An internal try catch Class123
  • 如何使用 WPF 用户控件关闭父窗口

    假设我有两个 WPF 窗口 window One 和 window Two window One 有一个按钮 单击此按钮将打开 window Two window Two contains a User Control 该用户控件有一个用于
  • Flash观看后不清晰

    这是我的创建动作 它创建一个新的 Message 实例 并通过模型验证进行检查 然后有一个简单的 if else 循环 如果模型验证已完成 则发送消息 如果要发送另一个视图 则渲染 新 视图 如果模型验证未得到满足 它只会再次呈现 新 视图
  • 如何在 Electron 应用程序中通过 navigator.geolocation 获取当前位置?

    当我尝试获取当前位置时 navigator geolocation getCurrentPosition handleCoordinates handleError timeout 10000 它返回 网络位置提供商位于 https www
  • Azure Functions [JavaScript / Node.js] - HTTP 调用,良好实践

    从我的 Azure 函数 在 Node js 中运行 由 EventHub 消息触发 中 我想向某个外部页面发出发布请求 就像是 module exports function context eventHubMessages var ht
  • 天文台服务器启动失败 - 无法创建套接字服务器

    我正在为自己构建一些内部工具 以使用我设置的一些模板以及可以在应用程序之间共享的一些附加功能来生成 Flutter 应用程序 目前 代码可以编译 构建并部署 但它会卡在第一个视图 空白屏幕 上 并在失败之 前重试启动 Observatory
  • 跨域iframe自动调整大小

    我正在使用 iframe 和 javascript 制作一个 Web 小部件 我想让我的 iframe 能够根据其内容 从其他域加载 调整大小 我做了一些搜索 包括在 Stack Overflow 上 我找到了几个主题 但我找不到关于这个问
  • cosmos 查询的 ORDER BY 不区分大小写

    这个问题几乎与我可以使用 Order By 和 ToLower 对 DocumentDB 执行不区分大小写的字符串排序吗 https stackoverflow com questions 38919101但由于 5 年前就有人问过这个问题
  • 根据 pandas 中的 groupby 或循环条件划分列

    我有一个数据框 如下所示 B ID No Show Session slot num Patient count 1 0 2 S1 1 1 2 0 3 S1 2 1 3 0 8 S1 3 1 4 0 3 S1 3 2 5 0 6 S1 4
  • 使用 firebase java.lang.NoClassDefFoundError 反应本机:无法解析:Lcom/google/android/gms/common/internal/zzbq

    我正在按照教程进行操作here https rnfirebase io docs v4 2 x auth android 并检查了堆栈溢出上的类似问题Android 3 1 1 解析失败 Lcom google android gms co
  • Bootstrap:使用单个选项卡导航控制多个选项卡面板

    我想用一个选项卡导航来控制两个不同的选项卡内容 在 Bootstrap 3 中 我有一个使用逗号分隔数据目标的解决方案 如本例所示 https stackoverflow com a 19719859 1788961 https stack
  • Int 数组上的 multi sub 与 Int 数组的数组

    我想要一个多重子 其中一个用于整数数组 另一个多重子用于整数数组的数组 这似乎可以解决问题 multi sub abc Int array say 10 multi sub abc Array Int array say 20 但是 构建满
  • 移动/调整大小期间 opengl 窗口冻结

    我正在使用 LWJGL 开发游戏 移动窗口时 计划将来添加调整大小代码 渲染循环冻结 我希望它在移动时继续以某种方式运行 LWJGL 不包括 glutMainLoop Display属于OpenGL 而不是Java 相关代码 regular
  • Laravel 5.4^ - 如何自定义通知电子邮件布局?

    我正在尝试自定义通过电子邮件发送通知时使用的 HTML 电子邮件布局 我已经发布了邮件和通知视图 php artisan vendor publish tag laravel mail php artisan vendor publish
  • 如何在R中创建for循环? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 R 编程中启动 for 循环 https stackoverflow com questions 4162363 how to start a for loop in r programmin
  • SingleOrDefault异常处理

    我有一个示例代码 它调用 SingleOrDefault 方法 3 次 并在任何序列具有多个匹配元素时记录异常 如果我想检查这段代码的哪一部分抛出异常 问题就开始了 是否可以从此异常中获取一些有用的信息 例如谓词参数或集合类型以进行更详细的