代码之家  ›  专栏  ›  技术社区  ›  kwcto

linq迭代器异常处理

  •  5
  • kwcto  · 技术社区  · 14 年前
    var trimmed = myStringArray.Select(s => s.Substring(0, 10));
    

    如果其中一个字符串的长度不是10个字符,我将得到ArgumentOutOfRangeException。

    在这种情况下,很容易发现,我知道我能做到

    s.Substring(0, Math.Min(10, s.Length))
    

    但是,对于更复杂的对象构造错误,像这样的错误并不总是容易看到的。有没有办法通过异常处理来查看哪些字符串不够长?

    3 回复  |  直到 14 年前
        1
  •  2
  •   Ian Mercer    14 年前

    创建一个执行复杂转换的方法,该方法可以抛出异常并从lambda调用它。例如,选择(s=>完成方法)

    string complexMethod(string s)
    {
      try
      {
        ...
        return ...
      }
      catch
      ...
    }
    

    现在,您可以在重新引发之前将异常记录在catch块中,或者在重新引发之前使用exception.data向其添加信息,或者使用所需的信息将其包装在自定义异常中。如果不是自定义异常,请记住在抛出时只使用“throw”。

    还可以将方法体内联到lambda中: .Select(s => { ... return ...})

        2
  •  0
  •   Klaus Byskov Pedersen    14 年前

    只要您不打算将它与linqtosql或ef一起使用,就可以创建自己的扩展方法来包装异常并告诉您字符串的值。

        3
  •  0
  •   Metro Smurf    14 年前

    在这种情况下,where子句可能适合过滤掉您要查找的长度:

    var trimmed = myStringArray
            .Where( s => s.Length >= 10 )
            .Select( s => s.Substring( 0, 10 ) );
    

    编辑
    只是重新阅读问题,意识到op正在寻找异常处理,以查看哪些字符串不够长。假设您不关心什么字符串足够长,那么提供的解决方案将起作用。