.NET 中的无效或意外参数应引发哪些类型的异常?我什么时候会选择一个而不是另一个?
如果你有一个函数需要一个对应于一个月的整数并且你传入了‘42’,你会使用哪个例外?即使它不是一个集合,这是否会属于“超出范围”类别?
我喜欢使用:ArgumentException、、ArgumentNullException和ArgumentOutOfRangeException。
ArgumentException
ArgumentNullException
ArgumentOutOfRangeException
还有其他选项,它们不会过多地关注论点本身,而是从整体上判断调用:
InvalidOperationException
NotSupportedException
诀窍是抛出最能说明为什么不能按原样调用方法的异常。理想情况下,异常应该详细说明出了什么问题,为什么是错误的,以及如何修复它。
我喜欢错误消息指向帮助、文档或其他资源。例如,Microsoft 在他们的知识库文章中迈出了良好的第一步,例如“为什么我在 Internet Explorer 中访问网页时会收到“操作中止”错误消息?”。当您遇到错误时,他们会将您指向错误消息中的知识库文章。他们没有做得好的是他们没有告诉你,为什么具体失败了。
再次感谢 STW(前 Yoooder)的评论。
作为对您的跟进的回应,我会抛出一个ArgumentOutOfRangeException. 看看 MSDN 关于这个异常的说法:
ArgumentOutOfRangeException当调用方法并且传递给该方法的至少一个参数不是空引用(Nothing在 Visual Basic 中)并且不包含有效值时引发。
Nothing
因此,在这种情况下,您传递了一个值,但这不是一个有效值,因为您的范围是 1-12。但是,您记录它的方式清楚地表明您的 API 抛出了什么。因为虽然我可能会说ArgumentOutOfRangeException,但另一个开发人员可能会说ArgumentException。让它变得简单并记录行为。