What exceptions should be thrown for invalid or unexpected parameters in .NET?

后端 未结 7 756
误落风尘
误落风尘 2020-12-22 16:43

What types of exceptions should be thrown for invalid or unexpected parameters in .NET? When would I choose one instead of another?

Follow-up:

Which excep

7条回答
  •  悲&欢浪女
    2020-12-22 17:11

    I voted for Josh's answer, but would like to add one more to the list:

    System.InvalidOperationException should be thrown if the argument is valid, but the object is in a state where the argument shouldn't be used.

    Update Taken from MSDN:

    InvalidOperationException is used in cases when the failure to invoke a method is caused by reasons other than invalid arguments.

    Let's say that your object has a PerformAction(enmSomeAction action) method, valid enmSomeActions are Open and Close. If you call PerformAction(enmSomeAction.Open) twice in a row then the second call should throw the InvalidOperationException (since the arugment was valid, but not for the current state of the control)

    Since you're already doing the right thing by programming defensively I have one other exception to mention is ObjectDisposedException. If your object implements IDisposable then you should always have a class variable tracking the disposed state; if your object has been disposed and a method gets called on it you should raise the ObjectDisposedException:

    public void SomeMethod()
    {
        If (m_Disposed) {
              throw new ObjectDisposedException("Object has been disposed")
         }
        // ... Normal execution code
    }
    

    Update: To answer your follow-up: It is a bit of an ambiguous situation, and is made a little more complicated by a generic (not in the .NET Generics sense) data type being used to represent a specific set of data; an enum or other strongly typed object would be a more ideal fit--but we don't always have that control.

    I would personally lean towards the ArgumentOutOfRangeException and provide a message that indicates the valid values are 1-12. My reasoning is that when you talk about months, assuming all integer representations of months are valid, then you are expecting a value in the range of 1-12. If only certain months (like months that had 31 days) were valid then you would not be dealing with a Range per-se and I would throw a generic ArgumentException that indicated the valid values, and I would also document them in the method's comments.

提交回复
热议问题