如何处理LINQ查询无匹配文件时抛出异常的问题
问题根因
你使用的LINQ方法First()的设计逻辑是:当查询返回的序列为空(也就是没有匹配到符合文件名筛选规则的文件)时,会直接抛出InvalidOperationException。
你之前写的try/catch没有生效,基本都是两个原因:
- 捕获的异常类型不匹配,比如只写了捕获
IOException但没覆盖到实际抛出的InvalidOperationException,或者异常抛出点不在你写的try块覆盖范围内 - 把预期内的边界场景用异常逻辑处理本身就是不合理的实现方式,很容易出现漏判
正确修复方案
直接使用FirstOrDefault()替代First()即可,这是处理这类空序列场景的标准实现,不需要依赖异常捕获:
DirectoryInfo dirInfo = new DirectoryInfo(directoryPath); string partialFileName = "partialFileName"; // 无匹配文件时FirstOrDefault会返回null,不会抛异常 FileInfo? recentlyModFile = (from files in dirInfo.GetFiles(partialFileName + "*") orderby files.LastWriteTime descending select files) .FirstOrDefault(); if (recentlyModFile == null) { // 此处编写无符合条件文件时的业务逻辑,比如返回提示、初始化默认文件等 } else { // 此处编写正常拿到最近修改文件后的处理逻辑 }
补充说明
- 如果你的项目使用C# 8及以上版本,建议给
FileInfo加上可空标记?,编译器会自动提醒你做判空校验,避免后续出现空引用异常 - 如果你坚持要用try/catch实现(极度不推荐,用异常控制业务分支属于反模式,会带来额外性能开销,代码可读性也差),必须明确捕获对应异常类型:
try { DirectoryInfo dirInfo = new DirectoryInfo(directoryPath); string partialFileName = "partialFileName"; FileInfo recentlyModFile = (from files in dirInfo.GetFiles(partialFileName + "*") orderby files.LastWriteTime descending select files).First(); } catch (InvalidOperationException) { // 此处处理无匹配文件的逻辑 }
内容的提问来源于stack exchange,提问作者m_beta
相关产品推荐
相关产品推荐

