为什么catch语句没有捕获所有exception?

我正在测试下面的方法,我意识到当我输入错误的文件名时,错误会被捕获,但是当我在指定的位置上没有元素时, IndexOutOfBounds的错误会使程序崩溃。 后者也用于转换错误。

private static IEnumerable Initialize() { try { string[] things = System.IO.File.ReadAllLines("things.txt"); return things.Select(_ => new Thing { Name = _.Split(';')[0], Id = Convert.ToInt32(_.Split(';')[0]) }); } catch(Exception exception) { Console.WriteLine(exception.Message); return new List(); } } 

尽管catch中最常见的Exception类型,为什么不处理某些错误? 是否与LINQ表达式失败有关? 如果是这样,我该如何强行捕捉呢?

这是因为你返回IEnumerable。 Select中的lambda不会立即执行,而只会在访问可枚举(迭代项)时执行。

如果在“选择”之后添加调用“ToArray”,则将计算所有项目,并在catch块中捕获IndexOutRangeException。

 return things.Select(_ => new Thing { Name = _.Split(';')[0], Id = Convert.ToInt32(_.Split(';')[0]) }).ToArray(); 

您正在返回IEnumerable<> ,这意味着延迟执行。
因此,lambda中的任何内容实际上都会在try / catch之外执行。

如果要捕获所有错误,请包含.ToList() ,如

  return things.Select(...).ToList(); 

我几年前经历过这个,我在网上找到的解释是因为非托管程序集和代码。 某些超出应用程序域的内容。 大多数情况下,当你有一个较低级别(操作级别)操作