我正在编写应用程序,我想根据用户提供的路径加载文件。我检查文件的扩展名,当扩展名与我认识的任何内容都不匹配时,我想抛出异常。
我可以扔IOException
。但是,我认为可能会有更详细的异常。所以我查看了MSDN并找到了FileLoadException
。该名称表明我的错误适合此类别,但....当我在MSDN上查看它时说:“表示找到汇编文件但无法加载时发生的错误。”和“找到托管程序集但无法加载时引发的异常”。这绝对不是我的错误的情况。
那么问题是什么呢?好吧,我想知道文档是否实际上意味着异常只是为了这个目的而被抛出,或者它们只是意味着他们在特定情况下抛出该异常,但是没有真正指定其他人何时应扔掉它。
在MSDN的IOException
页面上,建议在适当情况下使用FileLoadException
:
IOException
是使用流,文件和目录访问信息时抛出的异常的基类。基类库包括以下类型,每个类型都是
IOException
的派生类:
- DirectoryNotFoundException
- EndOfStreamException
- FileNotFoundException异常
- FileLoadException
- PathTooLongException
在适当的地方,使用这些类型而不是IOException。
总结:如果文件扩展名未知,我应该抛出IOException
还是FileLoadException
(我不想定义自己的例外)。
提前致谢。
答案 0 :(得分:3)
我不会抛出一个被记录为特定用例的异常,并且可能会混淆其他用例。
如果您无法定义新的例外,请坚持使用IOException
。
答案 1 :(得分:3)
你应该抛出IOException
,永远不要抛出非常具体和“技术性”的FileLoadException
(而你的例外应该是“面向应用的”)。尝试使用FileLoadException
(在mscorlib中)分析Reflector
类型,您将看到它仅用于msdn中定义的目的。然后想象有一天你的代码在“插件上下文”中使用,如何反应主机程序捕获FileLoadException
意味着程序集无法正确加载......
答案 2 :(得分:2)
FileLoadException
似乎不太合适,因为它专门用于装配。
IOException
是合适的,但它感觉非常通用,并且不会让调用者优雅地处理它,将其与更常见的错误区分开来。
如果你真的必须在这里抛出异常,请考虑NotSupportedException
,它标识尝试执行你的对象不支持的操作,在这种情况下加载你不认识的文件格式。
答案 3 :(得分:2)
好的做法是定义自己的异常:从Exception或任何其他更具体的Exception子类派生出一个。
这将节省您在测试期间的时间,并为您提供更多信息以及将来的反馈:您可以根据您的特定规则区分未在代码中处理的一些异常和您自己的业务逻辑抛出的异常。
说到这种情况,我建议你创建FileExtensionException
来自IOException
。这将使代码变得非常简单:您不必检查错误消息,为新的异常类型提供单独的catch
块。
答案 4 :(得分:0)
似乎只是验证用户数据的情况。
为什么要抛出异常并且不通知用户他提供的应用程序无法识别的扩展程序?
如果您使用的是OpenFileDialog
,您甚至可以使用OpenFileDialog.Filter
,以便用户只能选择具有应用程序支持的扩展名的文件。