ฉันโหวตให้คำตอบของ Joshแต่ต้องการเพิ่มอีกหนึ่งรายการ:
ควรส่งออก System.InvalidOperationException หากอาร์กิวเมนต์นั้นถูกต้อง แต่วัตถุอยู่ในสถานะที่ไม่ควรใช้อาร์กิวเมนต์
อัปเดตจาก MSDN:
InvalidOperationException จะใช้ในกรณีที่ความล้มเหลวในการเรียกใช้วิธีการที่เกิดจากเหตุผลอื่นที่ไม่ใช่ข้อโต้แย้งที่ไม่ถูกต้อง
สมมติว่าวัตถุของคุณมีเมธอด PerformAction (enmSomeAction) enmSomeActions ที่ใช้ได้คือ Open และ Close ถ้าคุณเรียก PerformAction (enmSomeAction.Open) สองครั้งติดต่อกันการเรียกครั้งที่สองควรใช้ InvalidOperationException (เนื่องจากการพิสูจน์ถูกต้อง แต่ไม่ใช่สถานะปัจจุบันของการควบคุม)
เนื่องจากคุณทำสิ่งที่ถูกต้องโดยการตั้งโปรแกรมการป้องกันฉันมีอีกหนึ่งข้อยกเว้นที่จะกล่าวถึงคือ ObjectDisposedException ถ้าวัตถุของคุณใช้ IDisposable แล้วคุณควรมีตัวแปรคลาสติดตามสถานะจำหน่าย หากวัตถุของคุณถูกกำจัดและวิธีการที่ได้รับเรียกคุณควรยกระดับ ObjectDisposedException:
public void SomeMethod()
{
If (m_Disposed) {
throw new ObjectDisposedException("Object has been disposed")
}
// ... Normal execution code
}
อัปเดต:เพื่อตอบการติดตามของคุณ: เป็นสถานการณ์ที่ไม่ชัดเจนและมีความซับซ้อนเล็กน้อยโดยประเภทข้อมูลทั่วไป (ไม่ได้อยู่ใน. NET Generics Sense) ที่ใช้เพื่อแสดงชุดข้อมูลเฉพาะ วัตถุ enum หรือวัตถุที่มีการพิมพ์อื่น ๆ จะเหมาะกว่า - แต่เราไม่ได้ควบคุมมันเสมอไป
ฉันจะเอนตัวไปทาง ArgumentOutOfRangeException โดยตรงและให้ข้อความที่ระบุว่าค่าที่ใช้ได้คือ 1-12 เหตุผลของฉันคือเมื่อคุณพูดถึงเดือนสมมติว่าการแทนจำนวนเต็มทั้งหมดของเดือนนั้นถูกต้องคุณก็คาดหวังค่าในช่วง 1-12 หากเพียงบางเดือน (เช่นเดือนที่มี 31 วัน) นั้นถูกต้องแล้วคุณจะไม่จัดการกับช่วงต่อและฉันจะโยน ArgumentException ทั่วไปที่ระบุค่าที่ถูกต้องและฉันจะบันทึกไว้ในความคิดเห็นของวิธีการ