考虑以下示例:作为我的程序配置的一部分,用户提供一个XML文件,该文件本质上应描述非循环图,但我的程序在加载时会找到一个图。这是一个严重错误,程序无法继续。应抛出什么异常?
其他示例包括尝试以某种特定格式(例如JPEG)加载文件,但在此过程中遇到错误;或通过网络从另一个第三方程序接收一些数据 应该是否正确,但不是。
本质上 - 你正在解析某种数据流,并在其中发现一个不应存在的错误,这意味着程序无法按预期继续。扔在这里的正确类型是什么?
(注意:这不应该是Argument XXX 异常,因为此数据不作为参数传递给方法。)
答案 0 :(得分:3)
创建自己的异常 - 我不相信BCL中会有一个异常类来描述这种情况。
也许是CyclicGraphFoundException
?
答案 1 :(得分:3)
至少在某些场景中,System.IO.InvalidDataException非常合适。
对于XML文件,最好的方法可能是针对预定义的模式进行验证,在这种情况下,将抛出System.Xml.Schema.XmlSchemaValidationException验证。
答案 2 :(得分:1)
为什么不提供自己的异常,说明应用程序无法加载配置。
对于流式JPEG的问题,请考虑FileFormatException
。
我认为最好是根据需要派生尽可能多的异常类来精确建模所遇到的情况,而不是将所有内容堆叠到相同的一般(太笼统的?!)异常类中,并且只有一条消息来区分这些情况强>
答案 3 :(得分:0)
您应该考虑自定义例外,或者也可以使用FileFormatException
。
一个时抛出的异常 输入文件或数据流 应该符合某个文件 格式规范格式不正确。
FileFormatException仅适用于.NET 3.5,3.0,需要引用WindowsBase。
答案 4 :(得分:0)
我会关注MSDN guidelines on Error Raising and handling,特别是
在大多数情况下,请使用预定义的异常类型。仅为程序化方案定义新的异常类型,您希望类库的用户捕获此类型的异常并根据异常类型本身执行编程操作...
在第一种情况下,文件是应用程序配置的一部分,我想你不会指望用户捕获并处理这个特定的异常,所以我会使用预定义的ConfigurationErrorsException
。
在其他情况下,我还会尝试使用预定义的异常,除非您希望客户端需要以不同方式处理此异常。其他人建议的.NET 3.5 FileFormatException
似乎是个不错的选择。你也可以使用(滥用?)一种类型,如System.Data.DataException,即使它的文档与你的情况不太匹配。如果您对此不满意,可以使用自定义异常类型 - 但无论如何,请记录您抛出的异常类型以及抛出异常类型的情况,并确保您的用户会满意。