【发布时间】:2015-06-12 08:37:56
【问题描述】:
我遇到了带有 ResxResourceReader 的 ArgumentException。
我知道该文件存在,但我不知道该文件的内容是否合适(它有 .resx 扩展名,但内容可能是垃圾或者根本就没有内容)。
问题是如何在不枚举的情况下检查它是否是正确的资源文件?由于使用reader.GetEnumerator() 枚举它会引发异常。
我查看了阅读器的属性,但没有看到任何可以让我这样做的东西。
我可以尝试一下并捕获异常,但如果可能的话我想避免这种情况。
有什么建议吗?
[EDIT] 我想特别避免 try-catch,因为在 catch 上我会用另一个 resx 文件执行 same 操作,如果那是无效的以及...好吧,你明白我的意思。虽然这应该很少发生。
【问题讨论】:
-
有什么理由不去尝试/赶上吗?
-
如果它是有效的 XML 文件,您可以首先(手动,不使用
XmlReader;即使使用<?xml进行原始检查也可能有效 - 小心编码)。它可能会减少它具有 resx 扩展的机会,但这不是您所期望的。我不会走得更远:如果它似乎 是一个 XML 文件并且它具有 .resx 扩展名,然后尝试打开它(并最终捕获异常)。在您完全解析它之前,您无法确定它是一个有效的 .resx(即使使用架构进行验证也是不够的,因为内容可能会损坏)。 -
@Amit 有很多争论。在我的应用程序中,性能是关键,可能有数百万个并发调用。因此,即使在每次使用应用程序时偶尔捕获一次异常,如果应用程序被调用数百万次,那么异常也会被捕获数百万次,这涉及到重要的性能块。 Relevant link
-
resx 文件是垃圾的可能性有多大? 1/100?是来自用户的输入吗?
-
我同意,但是完整的解析是 slow (再次因为除非你完全完成,否则你无法确定)。它不会减慢每百万个,而是每一个调用(因为它会执行两次:一次由您完成,另一次由 ResxResourceReader 执行 - 这可能比您快得多)。除非 99.9% 的时候你得到一个无效的 resx...捕获异常更快(但我会衡量...)
标签: c# argumentexception reader