ArgumentOutOfRangeException Classe

Définition

Exception levée quand la valeur d'un argument n'appartient pas à la plage de valeurs autorisées, comme défini par la méthode appelée.

public ref class ArgumentOutOfRangeException : ArgumentException
public class ArgumentOutOfRangeException : ArgumentException
[System.Serializable]
public class ArgumentOutOfRangeException : ArgumentException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class ArgumentOutOfRangeException : ArgumentException
type ArgumentOutOfRangeException = class
    inherit ArgumentException
type ArgumentOutOfRangeException = class
    inherit ArgumentException
    interface ISerializable
[<System.Serializable>]
type ArgumentOutOfRangeException = class
    inherit ArgumentException
    interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ArgumentOutOfRangeException = class
    inherit ArgumentException
    interface ISerializable
Public Class ArgumentOutOfRangeException
Inherits ArgumentException
Héritage
ArgumentOutOfRangeException
Héritage
ArgumentOutOfRangeException
Attributs
Implémente

Exemples

L’exemple suivant définit une classe qui contient des informations sur un invité invité. Si l’invité est jeune à 21, une ArgumentOutOfRangeException exception est levée.

using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Guest guest1 = new Guest("Ben", "Miller", 17);
            Console.WriteLine(guest1.GuestInfo());
        }
        catch (ArgumentOutOfRangeException outOfRange)
        {

            Console.WriteLine("Error: {0}", outOfRange.Message);
        }
    }
}

class Guest
{
    private string FirstName;
    private string LastName;
    private int Age;

    public Guest(string fName, string lName, int age)
    {
        FirstName = fName;
        LastName = lName;
        if (age < 21)
            throw new ArgumentOutOfRangeException("age","All guests must be 21-years-old or older.");
        else
            Age = age;
    }

    public string GuestInfo()
    {
        string gInfo = FirstName + " " + LastName + ", " + Age.ToString();
        return(gInfo);
    }
}
Module Module1
   Public Sub Main()
       Try
           Dim guest1 As Guest = New Guest("Ben", "Miller", 17)
           Console.WriteLine(guest1.GuestInfo)
       Catch outOfRange As ArgumentOutOfRangeException
           Console.WriteLine("Error: {0}", outOfRange.Message)
       End Try
   End Sub
End Module

Class Guest
    Private FirstName As String
    Private LastName As String
    Private Age As Integer

    Public Sub New(ByVal fName As String, ByVal lName As String, ByVal age As Integer)
        MyBase.New()
        FirstName = fName
        LastName = lName
        If (age < 21) Then
            Throw New ArgumentOutOfRangeException("age", "All guests must be 21-years-old or older.")
        Else
            age = age
        End If
    End Sub

    Public Function GuestInfo() As String
        Dim gInfo As String = (FirstName + (" " _
                    + (Me.LastName + (", " + Me.Age.ToString))))
        Return gInfo
    End Function
End Class

Remarques

Une ArgumentOutOfRangeException exception est levée lorsqu’une méthode est appelée et qu’au moins l’un des arguments passés à la méthode n’est pas null et contient une valeur non valide qui n’est pas un membre de l’ensemble de valeurs attendu pour l’argument. La ParamName propriété identifie l’argument non valide, et la ActualValue propriété, si une valeur est présente, identifie la valeur non valide.

En règle générale, il s’agit d’une ArgumentOutOfRangeException erreur de développeur. Au lieu de gérer l’exception dans un try / catch bloc, vous devez éliminer la cause de l’exception ou, si l’argument est retourné par un appel de méthode ou une entrée par l’utilisateur avant d’être passé à la méthode qui lève l’exception, vous devez valider les arguments avant de les passer à la méthode.

ArgumentOutOfRangeException est largement utilisé par :

Les conditions dans lesquelles une ArgumentOutOfRangeException exception est levée sont les suivantes :

  • Vous récupérez le membre d’une collection par son numéro d’index, et le numéro d’index n’est pas valide.

    Il s’agit de la cause la plus courante d’une ArgumentOutOfRangeException exception. En règle générale, le numéro d’index n’est pas valide pour l’une des quatre raisons suivantes :

    1. La collection n’a aucun membre, et votre code suppose qu’elle le fait. L’exemple suivant tente de récupérer le premier élément d’une collection qui n’a pas d’éléments :

      using System;
      using System.Collections.Generic;
      
      public class Example
      {
         public static void Main()
         {
            var list = new List<string>();
            Console.WriteLine("Number of items: {0}", list.Count);
            try {
               Console.WriteLine("The first item: '{0}'", list[0]);
            }
            catch (ArgumentOutOfRangeException e) {
               Console.WriteLine(e.Message);
            }
         }
      }
      // The example displays the following output:
      //   Number of items: 0
      //   Index was out of range. Must be non-negative and less than the size of the collection.
      //   Parameter name: index
      
      Imports System.Collections.Generic
      
      Module Example
         Public Sub Main()
            Dim list As New List(Of String)
            Console.WriteLine("Number of items: {0}", list.Count)
            Try
               Console.WriteLine("The first item: '{0}'", list(0))
            Catch e As ArgumentOutOfRangeException
               Console.WriteLine(e.Message)
            End Try
         End Sub
      End Module
      ' The example displays the following output:
      '   Number of items: 0
      '   Index was out of range. Must be non-negative and less than the size of the collection.
      '   Parameter name: index
      

      Pour éviter l’exception, vérifiez si la propriété de la collection Count est supérieure à zéro avant de tenter de récupérer les membres, comme le fait le fragment de code suivant.

      if (list.Count > 0)
         Console.WriteLine("The first item: '{0}'", list[0]);
      
      If list.Count > 0 Then
         Console.WriteLine("The first item: '{0}'", list(0))
      End If
      
    2. Dans certains cas, l’exception peut se produire parce que vous essayez d’ajouter un membre à une collection à l’aide d’un index qui n’existe pas, plutôt que d’appeler la méthode, telle que Add , qui existe à cet effet. L’exemple suivant tente d’ajouter un élément à une collection à l’aide d’un index inexistant plutôt que d’appeler la List<T>.Add méthode.

      using System;
      using System.Collections.Generic;
      
      public class Example
      {
         public static void Main()
         {
            var numbers = new List<int>();
            numbers.AddRange( new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20 } );
      
            var squares = new List<int>();
            for (int ctr = 0; ctr < numbers.Count; ctr++)
               squares[ctr] = (int) Math.Pow(numbers[ctr], 2);
         }
      }
      // The example displays the following output:
      //    Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
      //    Parameter name: index
      //       at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
      //       at Example.Main()
      
      Imports System.Collections.Generic
      
      Module Example
         Public Sub Main()
            Dim numbers As New List(Of Integer)
            numbers.AddRange( { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20 } )
            
            Dim squares As New List(Of Integer)
            For ctr As Integer = 0 To numbers.Count - 1
               squares(ctr) = CInt(numbers(ctr) ^ 2) 
            Next
         End Sub
      End Module
      ' The example displays the following output:
      '    Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
      '    Parameter name: index
      '       at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
      '       at Example.Main()
      

      Le fragment de code suivant corrige cette erreur :

      var squares = new List<int>();
      for (int ctr = 0; ctr < numbers.Count; ctr++)
         squares.Add((int) Math.Pow(numbers[ctr], 2));
      
      Dim squares As New List(Of Integer)
      For ctr As Integer = 0 To numbers.Count - 1
         squares.Add(CInt(numbers(ctr) ^ 2)) 
      Next
      
    3. Vous tentez de récupérer un élément dont l’index est négatif. Cela se produit généralement lorsque vous avez effectué une recherche dans une collection pour l’index d’un élément particulier et que vous avez par erreur supposé que la recherche est réussie. Dans l’exemple suivant, l’appel à la List<T>.FindIndex(Predicate<T>) méthode ne parvient pas à trouver une chaîne égale à « Z » et retourne-1. Toutefois, il s’agit d’une valeur d’index non valide.

      using System;
      using System.Collections.Generic;
      
      public class Example
      {
         public static void Main()
         {
            var list = new List<string>();
            list.AddRange( new String[] { "A", "B", "C" } );
            // Get the index of the element whose value is "Z".
            int index = list.FindIndex((new StringSearcher("Z")).FindEquals);
            try {
               Console.WriteLine("Index {0} contains '{1}'", index, list[index]);
            }
            catch (ArgumentOutOfRangeException e) {
               Console.WriteLine(e.Message);
            }
         }
      }
      
      internal class StringSearcher
      {
         string value;
      
         public StringSearcher(string value)
         {
            this.value = value;
         }
      
         public bool FindEquals(string s)
         {
            return s.Equals(value, StringComparison.InvariantCulture);
         }
      }
      // The example displays the following output:
      //   Index was out of range. Must be non-negative and less than the size of the collection.
      //   Parameter name: index
      
      Imports System.Collections.Generic
      
      Module Example
         Public Sub Main()
            Dim list As New List(Of String) 
            list.AddRange( { "A", "B", "C" } )
            ' Get the index of the element whose value is "Z".
            Dim index As Integer = list.FindIndex(AddressOf (New StringSearcher("Z")).FindEquals)
            Try
               Console.WriteLine("Index {0} contains '{1}'", index, list(index)) 
            Catch e As ArgumentOutOfRangeException
               Console.WriteLine(e.Message)
            End Try
         End Sub
      End Module
      
      Friend Class StringSearcher
         Dim value As String
         
         Public Sub New(value As String)
            Me.value = value
         End Sub
         
         Public Function FindEquals(s As String) As Boolean
            Return s.Equals(value, StringComparison.InvariantCulture) 
         End Function
      End Class
      ' The example displays the following output:
      '   Index was out of range. Must be non-negative and less than the size of the collection.
      '   Parameter name: index
      

      Pour éviter l’exception, vérifiez que la recherche est réussie en vous assurant que l’index retourné est supérieur ou égal à zéro avant de tenter de récupérer l’élément de la collection, comme le montre le fragment de code suivant.

      // Get the index of the element whose value is "Z".
      int index = list.FindIndex((new StringSearcher("Z")).FindEquals);
      if (index >= 0)
         Console.WriteLine("'Z' is found at index {0}", list[index]);
      
      ' Get the index of the element whose value is "Z".
      Dim index As Integer = list.FindIndex(AddressOf (New StringSearcher("Z")).FindEquals)
      If index >= 0 Then
         Console.WriteLine("Index {0} contains '{1}'", index, list(index)) 
      End If
      
    4. Vous tentez de récupérer un élément dont l’index est égal à la valeur de la propriété de la collection Count , comme l’illustre l’exemple suivant.

      using System;
      using System.Collections.Generic;
      
      public class Example
      {
         public static void Main()
         {
            var list = new List<string>();
            list.AddRange( new String[] { "A", "B", "C" } );
            try {
               // Display the elements in the list by index.
               for (int ctr = 0; ctr <= list.Count; ctr++)
                  Console.WriteLine("Index {0}: {1}", ctr, list[ctr]);
            }
            catch (ArgumentOutOfRangeException e) {
               Console.WriteLine(e.Message);
            }
         }
      }
      // The example displays the following output:
      //   Index 0: A
      //   Index 1: B
      //   Index 2: C
      //   Index was out of range. Must be non-negative and less than the size of the collection.
      //   Parameter name: index
      
      Imports System.Collections.Generic
      
      Module Example
         Public Sub Main()
            Dim list As New List(Of String) 
            list.AddRange( { "A", "B", "C" } )
            Try
               ' Display the elements in the list by index.
               For ctr As Integer = 0 To list.Count
                  Console.WriteLine("Index {0}: {1}", ctr, list(ctr)) 
               Next   
            Catch e As ArgumentOutOfRangeException
               Console.WriteLine(e.Message)
            End Try
         End Sub
      End Module
      ' The example displays the following output:
      '   Index 0: A
      '   Index 1: B
      '   Index 2: C
      '   Index was out of range. Must be non-negative and less than the size of the collection.
      '   Parameter name: index
      

      Étant donné que les collections dans .NET utilisent l’indexation de base zéro, le premier élément de la collection est à l’index 0 et le dernier élément à l’index Count -1. Vous pouvez éliminer l’erreur en vous assurant que vous accédez au dernier élément à l’index Count -1, comme le fait le code suivant.

      // Display the elements in the list by index.
      for (int ctr = 0; ctr < list.Count; ctr++)
         Console.WriteLine("Index {0}: {1}", ctr, list[ctr]);
      
      ' Display the elements in the list by index.
      For ctr As Integer = 0 To list.Count - 1 
         Console.WriteLine("Index {0}: {1}", ctr, list(ctr)) 
      Next
      
  • Vous tentez d’effectuer une opération de chaîne en appelant une méthode de manipulation de chaînes, et l’index de départ n’existe pas dans la chaîne.

    Les surcharges de méthodes telles que String.Compare , String.CompareOrdinal , String.IndexOf , IndexOfAny , String.Insert , String.LastIndexOf , String.LastIndexOfAny , Remove ou String.Substring qui vous permettent de spécifier l’index de départ de l’opération requièrent que l’index soit une position valide dans la chaîne. Les index valides sont compris entre 0 et String.Length -1.

    Il y a quatre causes courantes de cette ArgumentOutOfRangeException exception :

    1. Vous utilisez une chaîne vide ou String.Empty . Étant donné que sa String.Length propriété retourne la valeur 0, toute tentative de manipulation par index lève une ArgumentOutOfRangeException exception. L’exemple suivant définit une GetFirstCharacter méthode qui retourne le premier caractère d’une chaîne. Si la chaîne est vide, comme la dernière chaîne passée à la méthode est, la méthode lève une ArgumentOutOfRangeException exception.

      using System;
      
      public class Example
      {
         public static void Main()
         {
             String[] words = { "the", "today", "tomorrow", " ", "" };
             foreach (var word in words)
                Console.WriteLine("First character of '{0}': '{1}'",
                                  word, GetFirstCharacter(word));
         }
      
         private static char GetFirstCharacter(string s)
         {
            return s[0];
         }
      }
      // The example displays the following output:
      //    First character of //the//: //t//
      //    First character of //today//: //t//
      //    First character of //tomorrow//: //t//
      //    First character of // //: // //
      //
      //    Unhandled Exception: System.IndexOutOfRangeException: Index was outside the bounds of the array.
      //       at Example.Main()
      
      Module Example
         Public Sub Main()
             Dim words() As String = { "the", "today", "tomorrow", " ", "" }
             For Each word In words
                Console.WriteLine("First character of '{0}': '{1}'", 
                                  word, GetFirstCharacter(word))
             Next                     
         End Sub
         
         Private Function GetFirstCharacter(s As String) As Char
            Return s(0)
         End Function
      End Module
      ' The example displays the following output:
      '    First character of 'the': 't'
      '    First character of 'today': 't'
      '    First character of 'tomorrow': 't'
      '    First character of ' ': ' '
      '    
      '    Unhandled Exception: System.IndexOutOfRangeException: Index was outside the bounds of the array.
      '       at Example.Main()
      

      Vous pouvez éliminer l’exception en testant si la chaîne String.Length est supérieure à zéro ou en appelant la IsNullOrEmpty méthode pour vous assurer que la chaîne n’est pas null ou vide. Le fragment de code suivant effectue ce dernier. Dans ce cas, si la chaîne est null ou vide, la GetFirstCharacter méthode retourne U + 0000.

      static char GetFirstCharacter(string s)
      {
         if (string.IsNullOrEmpty(s))
            return '\u0000';
         else
            return s[0];
      }
      
      Function GetFirstCharacter(s As String) As Char
         If String.IsNullOrEmpty(s) Then 
            Return ChrW(0)
         Else   
            Return s(0)
         End If   
      End Function
      
    2. Vous manipulez une chaîne en fonction de la position d’une sous-chaîne dans cette chaîne, et vous n’avez pas réussi à déterminer si la sous-chaîne a été réellement trouvée.

      L’exemple suivant extrait le deuxième mot d’une expression à deux mots. Elle lève une ArgumentOutOfRangeException exception si l’expression se compose d’un seul mot et, par conséquent, ne contient pas de caractère d’espace incorporé. Cela se produit parce que l’appel à la String.IndexOf(String) méthode retourne-1 pour indiquer que la recherche a échoué, et cette valeur non valide est ensuite transmise à la String.Substring(Int32) méthode.

      using System;
      
      public class Example
      {
         public static void Main()
         {
            String[] phrases = { "ocean blue", "concerned citizen",
                                 "runOnPhrase" };
            foreach (var phrase in phrases)
               Console.WriteLine("Second word is {0}", GetSecondWord(phrase));
         }
      
         static string GetSecondWord(string s)
         {
            int pos = s.IndexOf(" ");
            return s.Substring(pos).Trim();
         }
      }
      // The example displays the following output:
      //    Second word is blue
      //    Second word is citizen
      //
      //    Unhandled Exception: System.ArgumentOutOfRangeException: StartIndex cannot be less than zero.
      //    Parameter name: startIndex
      //       at System.String.Substring(Int32 startIndex, Int32 length)
      //       at Example.GetSecondWord(String s)
      //       at Example.Main()
      
      Module Example
         Public Sub Main()
            Dim phrases() As String = { "ocean blue", "concerned citizen", 
                                        "runOnPhrase" }
            For Each phrase In phrases
               Console.WriteLine("Second word is {0}", GetSecondWord(phrase))
            Next                            
        End Sub
        
        Function GetSecondWord(s As String) As String
           Dim pos As Integer = s.IndexOf(" ")
           Return s.Substring(pos).Trim()
        End Function
      End Module
      ' The example displays the following output:
      '       Second word is blue
      '       Second word is citizen
      '       
      '       Unhandled Exception: System.ArgumentOutOfRangeException: StartIndex cannot be less than zero.
      '       Parameter name: startIndex
      '          at System.String.Substring(Int32 startIndex, Int32 length)
      '          at Example.GetSecondWord(String s)
      '          at Example.Main()
      

      Pour éliminer l’exception, validez la valeur retournée par la méthode de recherche de chaîne avant d’appeler la méthode de manipulation de chaînes.

      using System;
      
      public class Example
      {
         public static void Main()
         {
            String[] phrases = { "ocean blue", "concerned citizen",
                                 "runOnPhrase" };
            foreach (var phrase in phrases) {
               string word = GetSecondWord(phrase);
               if (! string.IsNullOrEmpty(word))
                  Console.WriteLine("Second word is {0}", word);
            }
         }
      
         static string GetSecondWord(string s)
         {
            int pos = s.IndexOf(" ");
            if (pos >= 0)
               return s.Substring(pos).Trim();
            else
               return string.Empty;
         }
      }
      // The example displays the following output:
      //       Second word is blue
      //       Second word is citizen
      
      Module Example
         Public Sub Main()
            Dim phrases() As String = { "ocean blue", "concerned citizen", 
                                        "runOnPhrase" }
            For Each phrase In phrases
               Dim word As String = GetSecondWord(phrase)
               If Not String.IsNullOrEmpty(word) Then _
                  Console.WriteLine("Second word is {0}", word)
            Next                            
         End Sub
        
         Function GetSecondWord(s As String) As String
            Dim pos As Integer = s.IndexOf(" ")
            If pos >= 0
                Return s.Substring(pos).Trim()
            Else
               Return String.Empty
            End If
        End Function
      End Module
      ' The example displays the following output:
      '       Second word is blue
      '       Second word is citizen
      
    3. Vous avez tenté d’extraire une sous-chaîne qui se trouve en dehors de la plage de la chaîne actuelle.

      Les méthodes qui extraient des sous-chaînes requièrent que vous spécifiiez la position de départ de la sous-chaîne et, pour les sous-chaînes qui ne continuent pas jusqu’à la fin de la chaîne, le nombre de caractères dans la sous-chaîne. Notez qu’il ne s’agit pas de l' index du dernier caractère de la sous-chaîne.

      Une ArgumentOutOfRangeException exception est généralement levée dans ce cas, car vous avez calculé de manière incorrecte le nombre de caractères dans la sous-chaîne. Si vous utilisez une méthode de recherche telle que String.IndexOf pour identifier les positions de début et de fin d’une sous-chaîne :

      • Si le caractère de la position de fin retourné par String.IndexOf doit être inclus dans la sous-chaîne, la position de fin de la sous-chaîne est donnée par la formule

        endIndex - startIndex + 1
        
      • Si le caractère de la position de fin retourné par String.IndexOf doit être exclu de la sous-chaîne, la position de fin de la sous-chaîne est donnée par la formule

        endIndex - startIndex
        

        L’exemple suivant définit une FindWords méthode qui utilise la String.IndexOfAny(Char[], Int32) méthode pour identifier des espaces et des signes de ponctuation dans une chaîne et retourne un tableau qui contient les mots trouvés dans la chaîne.

        using System;
        using System.Collections.Generic;
        
        public class Example
        {
           public static void Main()
           {
              string sentence = "This is a simple, short sentence.";
              Console.WriteLine("Words in '{0}':", sentence);
              foreach (var word in FindWords(sentence))
                 Console.WriteLine("   '{0}'", word);
           }
        
           static String[] FindWords(string s)
           {
              int start = 0, end = 0;
              Char[] delimiters = { ' ', '.', ',', ';', ':', '(', ')' };
              var words = new List<string>();
        
              while (end >= 0) {
                 end = s.IndexOfAny(delimiters, start);
                 if (end >= 0) {
                    if (end - start > 0)
                       words.Add(s.Substring(start, end - start));
        
                    start = end + 1;
                 }
                 else {
                    if (start < s.Length - 1)
                       words.Add(s.Substring(start));
                 }
              }
              return words.ToArray();
           }
        }
        // The example displays the following output:
        //       Words in 'This is a simple, short sentence.':
        //          'This'
        //          'is'
        //          'a'
        //          'simple'
        //          'short'
        //          'sentence'
        
        Imports System.Collections.Generic
        
        Module Example
           Public Sub Main()
              Dim sentence As String = "This is a simple, short sentence."
              Console.WriteLine("Words in '{0}':", sentence)
              For Each word In FindWords(sentence)
                 Console.WriteLine("   '{0}'", word)
              Next
           End Sub
           
           Function FindWords(s As String) As String()
              Dim start, ending As Integer
              Dim delimiters() As Char = { " "c, "."c, ","c, ";"c, ":"c,
                                           "("c, ")"c }
              Dim words As New List(Of String)()
        
              Do While ending >= 0
                 ending = s.IndexOfAny(delimiters, start)
                 If ending >= 0
                    If ending - start > 0 Then
                       words.Add(s.Substring(start, ending - start)) 
                    End If
                    start = ending + 1
                 Else
                    If start < s.Length - 1 Then
                       words.Add(s.Substring(start))
                    End If      
                 End If
              Loop    
              Return words.ToArray()                         
           End Function
        End Module
        ' The example displays the following output:
        '       Words in 'This is a simple, short sentence.':
        '          'This'
        '          'is'
        '          'a'
        '          'simple'
        '          'short'
        '          'sentence'
        
  • Vous avez passé un nombre négatif à une méthode avec un argument qui requiert uniquement des nombres positifs et zéro, ou vous avez passé un nombre négatif ou zéro à une méthode avec un argument qui requiert uniquement des nombres positifs.

    Par exemple, la Array.CreateInstance(Type, Int32, Int32, Int32) méthode exige que vous spécifiiez le nombre d’éléments dans chaque dimension d’un tableau à deux dimensions ; les valeurs valides pour chaque dimension peuvent être comprises entre 0 et Int32.MaxValue . Toutefois, étant donné que l’argument de dimension de l’exemple suivant a une valeur négative, la méthode lève une ArgumentOutOfRangeException exception.

    using System;
    
    public class Example
    {
       public static void Main()
       {
          int dimension1 = 10;
          int dimension2 = -1;
          try {
             Array arr = Array.CreateInstance(typeof(string),
                                              dimension1, dimension2);
          }
          catch (ArgumentOutOfRangeException e) {
             if (e.ActualValue != null)
                Console.WriteLine("{0} is an invalid value for {1}: ", e.ActualValue, e.ParamName);
             Console.WriteLine(e.Message);
          }
       }
    }
    // The example displays the following output:
    //     Non-negative number required.
    //     Parameter name: length2
    
    Module Example
       Public Sub Main()
          Dim dimension1 As Integer = 10
          Dim dimension2 As Integer = -1
          Try
             Dim arr AS Array = Array.CreateInstance(GetType(String), 
                                                     dimension1, dimension2)
          Catch e As ArgumentOutOfRangeException
             If e.ActualValue IsNot Nothing Then
                Console.WriteLine("{0} is an invalid value for {1}: ", 
                                  e.ActualValue, e.ParamName)
             End If                     
             Console.WriteLine(e.Message)
          End Try
       End Sub
    End Module
    ' The example displays the following output:
    '     Non-negative number required.
    '     Parameter name: length2
    

    Pour corriger l’erreur, assurez-vous que la valeur de l’argument non valide n’est pas négative. Pour ce faire, vous pouvez fournir une valeur valide, comme le montre le fragment de code suivant.

    int dimension1 = 10;
    int dimension2 = 10;
    Array arr = Array.CreateInstance(typeof(string),
                                     dimension1, dimension2);
    
    Dim dimension1 As Integer = 10
    Dim dimension2 As Integer = 10
    Dim arr As Array = Array.CreateInstance(GetType(String), 
                                            dimension1, dimension2)
    

    Vous pouvez également valider l’entrée et, si elle n’est pas valide, effectuer une action. Le fragment de code suivant affiche un message d’erreur au lieu d’appeler la méthode.

    if (dimension1 < 0 || dimension2 < 0) {
       Console.WriteLine("Unable to create the array.");
       Console.WriteLine("Specify non-negative values for the two dimensions.");
    }
    else {
       arr = Array.CreateInstance(typeof(string),
                                  dimension1, dimension2);
    }
    
    If dimension1 < 0 OrElse dimension2 < 0 Then
       Console.WriteLine("Unable to create the array.")
       Console.WriteLine("Specify non-negative values for the two dimensions.")
    Else
       arr = Array.CreateInstance(GetType(String), 
                                  dimension1, dimension2)   
    End If
    
  • Il existe une condition de concurrence dans une application multithread ou qui a des tâches qui s’exécutent de façon asynchrone et qui met à jour un tableau ou une collection.

    L’exemple suivant utilise un List<T> objet pour remplir une collection d' Continent objets. Elle lève une exception ArgumentOutOfRangeException si l’exemple tente d’afficher les sept éléments dans la collection avant que la collection soit entièrement remplie.

    using System;
    using System.Collections.Generic;
    using System.Threading;
    
    public class Continent
    {
       public string Name { get; set; }
       public int Population { get; set; }
       public Decimal Area { get; set; }
    }
    
    public class Example
    {
       static List<Continent> continents = new List<Continent>();
       static string msg;
    
       public static void Main()
       {
          String[] names = { "Africa", "Antarctica", "Asia",
                             "Australia", "Europe", "North America",
                             "South America" };
          // Populate the list.
          foreach (var name in names) {
             var th = new Thread(PopulateContinents);
             th.Start(name);
          }
          Console.WriteLine(msg);
          Console.WriteLine();
    
          // Display the list.
          for (int ctr = 0; ctr < names.Length; ctr++) {
             var continent = continents[ctr];
             Console.WriteLine("{0}: Area: {1}, Population {2}",
                               continent.Name, continent.Population,
                               continent.Area);
          }
       }
    
       private static void PopulateContinents(Object obj)
       {
          string name = obj.ToString();
          msg += string.Format("Adding '{0}' to the list.\n", name);
          var continent = new Continent();
          continent.Name = name;
          // Sleep to simulate retrieving remaining data.
          Thread.Sleep(50);
          continents.Add(continent);
       }
    }
    // The example displays output like the following:
    //    Adding //Africa// to the list.
    //    Adding //Antarctica// to the list.
    //    Adding //Asia// to the list.
    //    Adding //Australia// to the list.
    //    Adding //Europe// to the list.
    //    Adding //North America// to the list.
    //    Adding //South America// to the list.
    //
    //
    //
    //    Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
    //    Parameter name: index
    //       at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
    //       at Example.Main()
    
    Imports System.Collections.Generic
    Imports System.Threading
    
    Public Class Continent
       Public Property Name As String
       Public Property Population As Integer
       Public Property Area As Decimal  
    End Class
    
    Module Example
       Dim continents As New List(Of Continent)
       Dim msg As String 
          
       Public Sub Main()
          Dim names() As String = { "Africa", "Antarctica", "Asia", 
                                         "Australia", "Europe", "North America",
                                         "South America" }
          ' Populate the list.
          For Each name In names
             Dim th As New Thread(AddressOf PopulateContinents)
             th.Start(name)
          Next              
          Console.WriteLine(msg)
          Console.WriteLine()
    
          ' Display the list.
          For ctr As Integer = 0 To names.Length - 1
             Dim continent = continents(ctr)
             Console.WriteLine("{0}: Area: {1}, Population {2}", 
                               continent.Name, continent.Population,
                               continent.Area)
          Next
       End Sub
       
       Private Sub PopulateContinents(obj As Object)
          Dim name As String = obj.ToString()
          msg += String.Format("Adding '{0}' to the list.{1}", name, vbCrLf)
          Dim continent As New Continent()
          continent.Name = name
          ' Sleep to simulate retrieving remaining data.
          Thread.Sleep(50)
          continents.Add(continent)
       End Sub
    End Module
    ' The example displays output like the following:
    '    Adding 'Africa' to the list.
    '    Adding 'Antarctica' to the list.
    '    Adding 'Asia' to the list.
    '    Adding 'Australia' to the list.
    '    Adding 'Europe' to the list.
    '    Adding 'North America' to the list.
    '    Adding 'South America' to the list.
    '    
    '    
    '    
    '    Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
    '    Parameter name: index
    '       at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
    '       at Example.Main()
    

    Dans ce cas, deux ressources sont accessibles à partir de plusieurs threads :

    • Collection continents. Sa List<T>.Add méthode est appelée à partir de plusieurs threads. En outre, le thread principal ou principal suppose que la collection est entièrement remplie avec sept éléments lorsqu’elle itère ses membres.

    • msgChaîne, concaténée à partir de plusieurs threads.

    Pour corriger l’erreur, assurez-vous que l’état partagé est accessible de façon thread-safe, comme suit.

    • Si votre application utilise un tableau ou un objet de collection, envisagez d’utiliser une classe de collection thread-safe, telle que les types dans l' System.Collections.Concurrent espace de noms ou la System.Collections.Immutable version hors plage.

    • Veillez à ce que l’état partagé (c’est-à-dire les ressources accessibles par plusieurs threads) soit accessible de façon thread-safe, afin qu’un seul thread à la fois dispose d’un accès exclusif aux ressources. Un grand nombre de classes, telles que CountdownEvent , Interlocked , Monitor et Mutex , sont disponibles pour synchroniser l’accès aux ressources. Pour plus d’informations, consultez Threading. En outre, la prise en charge linguistique est disponible par le biais de l’instruction Lock en C# et de la construction SyncLock dans Visual Basic.

    L’exemple suivant traite le ArgumentOutOfRangeException et les autres problèmes de l’exemple précédent. Elle remplace l' List<T> objet par un ConcurrentBag<T> objet pour garantir que l’accès à la collection est thread-safe, utilise un CountdownEvent objet pour garantir que le thread d’application continue uniquement après l’exécution d’autres threads et utilise un verrou pour garantir qu’un seul thread peut accéder msg à la variable à la fois.

    using System;
    using System.Collections.Concurrent;
    using System.Threading;
    
    public class Continent
    {
       public string Name { get; set; }
       public int Population { get; set; }
       public Decimal Area { get; set; }
    }
    
    public class Example
    {
       static ConcurrentBag<Continent> continents = new ConcurrentBag<Continent>();
       static CountdownEvent gate;
       static string msg = string.Empty;
    
       public static void Main()
       {
          String[] names = { "Africa", "Antarctica", "Asia",
                             "Australia", "Europe", "North America",
                             "South America" };
          gate = new CountdownEvent(names.Length);
    
          // Populate the list.
          foreach (var name in names) {
             var th = new Thread(PopulateContinents);
             th.Start(name);
          }
    
          // Display the list.
          gate.Wait();
          Console.WriteLine(msg);
          Console.WriteLine();
    
          var arr = continents.ToArray();
          for (int ctr = 0; ctr < names.Length; ctr++) {
             var continent = arr[ctr];
             Console.WriteLine("{0}: Area: {1}, Population {2}",
                               continent.Name, continent.Population,
                               continent.Area);
          }
       }
    
       private static void PopulateContinents(Object obj)
       {
          string name = obj.ToString();
          lock(msg) {
             msg += string.Format("Adding '{0}' to the list.\n", name);
          }
          var continent = new Continent();
          continent.Name = name;
          // Sleep to simulate retrieving remaining data.
          Thread.Sleep(25);
          continents.Add(continent);
          gate.Signal();
       }
    }
    // The example displays output like the following:
    //       Adding 'Africa' to the list.
    //       Adding 'Antarctica' to the list.
    //       Adding 'Asia' to the list.
    //       Adding 'Australia' to the list.
    //       Adding 'Europe' to the list.
    //       Adding 'North America' to the list.
    //       Adding 'South America' to the list.
    //
    //
    //       Africa: Area: 0, Population 0
    //       Antarctica: Area: 0, Population 0
    //       Asia: Area: 0, Population 0
    //       Australia: Area: 0, Population 0
    //       Europe: Area: 0, Population 0
    //       North America: Area: 0, Population 0
    //       South America: Area: 0, Population 0
    
    Imports System.Collections.Concurrent
    Imports System.Threading
    
    Public Class Continent
       Public Property Name As String
       Public Property Population As Integer
       Public Property Area As Decimal  
    End Class
    
    Module Example
       Dim continents As New ConcurrentBag(Of Continent)
       Dim gate As CountdownEvent
       Dim msg As String = String.Empty
          
       Public Sub Main()
          Dim names() As String = { "Africa", "Antarctica", "Asia", 
                                    "Australia", "Europe", "North America",
                                    "South America" }
          gate = new CountdownEvent(names.Length)
          
          ' Populate the list.
          For Each name In names
             Dim th As New Thread(AddressOf PopulateContinents)
             th.Start(name)
          Next              
    
          ' Display the list.
          gate.Wait()
          Console.WriteLine(msg)
          Console.WriteLine()
    
          For ctr As Integer = 0 To names.Length - 1
             Dim continent = continents(ctr)
             Console.WriteLine("{0}: Area: {1}, Population {2}", 
                               continent.Name, continent.Population,
                               continent.Area)
          Next
       End Sub
       
       Private Sub PopulateContinents(obj As Object)
          Dim name As String = obj.ToString()
          SyncLock msg 
             msg += String.Format("Adding '{0}' to the list.{1}", name, vbCrLf)
          End SyncLock
          Dim continent As New Continent()
          continent.Name = name
          ' Sleep to simulate retrieving remaining data.
          Thread.Sleep(25)
          continents.Add(continent)
          gate.Signal()
       End Sub
    End Module
    ' The example displays output like the following:
    '    Adding 'Africa' to the list.
    '    Adding 'Antarctica' to the list.
    '    Adding 'Asia' to the list.
    '    Adding 'Australia' to the list.
    '    Adding 'Europe' to the list.
    '    Adding 'North America' to the list.
    '    Adding 'South America' to the list.
    '    
    '    
    '    Africa: Area: 0, Population 0
    '    Antarctica: Area: 0, Population 0
    '    Asia: Area: 0, Population 0
    '    Australia: Area: 0, Population 0
    '    Europe: Area: 0, Population 0
    '    North America: Area: 0, Population 0
    '    South America: Area: 0, Population 0
    

ArgumentOutOfRangeException utilise le COR_E_ARGUMENTOUTOFRANGE HRESULT, qui a la valeur 0x80131502.

Pour obtenir la liste des valeurs initiales des propriétés d’une instance de ArgumentOutOfRangeException, consultez le ArgumentOutOfRangeException constructeurs.

Constructeurs

ArgumentOutOfRangeException()

Initialise une nouvelle instance de la classe ArgumentOutOfRangeException.

ArgumentOutOfRangeException(SerializationInfo, StreamingContext)

Initialise une nouvelle instance de la classe ArgumentOutOfRangeException avec des données sérialisées.

ArgumentOutOfRangeException(String)

Initialise une nouvelle instance de la classe ArgumentOutOfRangeException avec le nom du paramètre ayant provoqué l'exception.

ArgumentOutOfRangeException(String, Exception)

Initialise une nouvelle instance de la classe ArgumentOutOfRangeException avec un message d'erreur spécifié et l'exception qui est à l'origine de cette exception.

ArgumentOutOfRangeException(String, Object, String)

Initialise une nouvelle instance de la classe ArgumentOutOfRangeException avec le nom du paramètre, la valeur de l'argument et un message d'erreur spécifié.

ArgumentOutOfRangeException(String, String)

Initialise une nouvelle instance de la classe ArgumentOutOfRangeException avec le nom du paramètre ayant provoqué l'exception et un message d'erreur spécifié.

Propriétés

ActualValue

Obtient la valeur de l'argument qui provoque cette exception.

Data

Obtient une collection de paires clé/valeur qui fournissent des informations définies par l'utilisateur supplémentaires sur l'exception.

(Hérité de Exception)
HelpLink

Obtient ou définit un lien vers le fichier d'aide associé à cette exception.

(Hérité de Exception)
HResult

Obtient ou définit HRESULT, valeur numérique codée qui est assignée à une exception spécifique.

(Hérité de Exception)
InnerException

Obtient l'instance Exception qui a provoqué l'exception actuelle.

(Hérité de Exception)
Message

Obtient le message d'erreur et la chaîne représentant la valeur de l'argument non valide, ou uniquement le message d'erreur si la valeur de l'argument est Null.

ParamName

Obtient le nom du paramètre qui a provoqué cette exception.

(Hérité de ArgumentException)
Source

Obtient ou définit le nom de l'application ou de l'objet qui est à l'origine de l'erreur.

(Hérité de Exception)
StackTrace

Obtient une représentation sous forme de chaîne des frames immédiats sur la pile des appels.

(Hérité de Exception)
TargetSite

Obtient la méthode qui lève l'exception actuelle.

(Hérité de Exception)

Méthodes

Equals(Object)

Détermine si l'objet spécifié est égal à l'objet actuel.

(Hérité de Object)
GetBaseException()

En cas de substitution dans une classe dérivée, retourne la Exception qui est à l'origine d'une ou de plusieurs exceptions ultérieures.

(Hérité de Exception)
GetHashCode()

Fait office de fonction de hachage par défaut.

(Hérité de Object)
GetObjectData(SerializationInfo, StreamingContext)

Définit l'objet SerializationInfo à l'aide de la valeur de l'argument non valide et d'autres informations se rapportant à l'exception.

GetObjectData(SerializationInfo, StreamingContext)

Définit l'objet SerializationInfo avec le nom du paramètre et d'autres informations se rapportant à l'exception.

(Hérité de ArgumentException)
GetType()

Obtient le type au moment de l'exécution de l'instance actuelle.

(Hérité de Exception)
MemberwiseClone()

Crée une copie superficielle du Object actuel.

(Hérité de Object)
ToString()

Crée et retourne une chaîne représentant l'exception actuelle.

(Hérité de Exception)

Événements

SerializeObjectState
Obsolète.

Se produit quand une exception est sérialisée pour créer un objet d'état d'exception qui contient des données sérialisées concernant l'exception.

(Hérité de Exception)

S’applique à

Voir aussi