LINQ迭代器异常处理

kwc*_*cto 5 c# linq iterator exception-handling

var trimmed = myStringArray.Select(s => s.Substring(0, 10));
Run Code Online (Sandbox Code Playgroud)

如果其中一个字符串长度不是10个字符,我会得到一个ArgumentOutOfRangeException.

在这种情况下,它很容易找到,我知道我可以做到

s.Substring(0, Math.Min(10, s.Length))
Run Code Online (Sandbox Code Playgroud)

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

Ian*_*cer 2

创建一个方法来执行可以引发异常的复杂转换并从 lambda 调用它。例如 .Select(s => complexMethod(s))

string complexMethod(string s)
{
  try
  {
    ...
    return ...
  }
  catch
  ...
}
Run Code Online (Sandbox Code Playgroud)

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

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