Saltar al contenido

Excepciones comúnmente encontradas – Excepción de operación inválida

El tipo de excepción InvalidOperationException se lanza cuando una llamada a un método es inválida para el estado actual del objeto. Algunas causas comunes de la excepción InvalidOperationException son:

  1. Actualizando un hilo de UI de un hilo no UI.
  2. Cambiar una colección mientras se itera.
  3. Clasificar un conjunto o colección cuyos objetos no se pueden comparar.
  4. Echando un nulo que es nulo a su tipo subyacente.
  5. Llamando a un método de System.Linq.Enumerable en una colección vacía.

Veamos un ejemplo en el que añadimos objetos a una colección mientras la iteramos. Crear un nuevo proyecto de aplicación de consola. Abre Program.cs y pon el siguiente código en él:

Excepciones comúnmente encontradas – Excepción de operación inválida
Excepciones comúnmente encontradas – Excepción de operación inválida
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849utilizando el Sistema;usando el Sistema.Colecciones. Genérico;namespace MyApp{classProgram{staticvoidMain(string[] args){try{var accounts =newList<Account;(){newAccount("Jimmy Gradle",900),newAccount("Sophie Gradle",300)}; Consola. WriteLine("Bucle a través de las cuentas disponibles");foreach(Cuenta en cuentas){ Consola.WriteLine("{0} tiene {1} dólares", cuenta.Nombre, cuenta.Saldo);if(account.Name =="Sophie Gradle"){var newAccount =newAccount("Jeremy brown",1500); Console.WriteLine("Añadiendo {0} a la colección...
", newAccount.Name); accounts.Add(newAccount);}}}catch(InvalidOperationException ex){ Console.WriteLine("Oh no, algo salió mal"); Console.WriteLine(ex. Message);}}}classAccount{publicAccount(string name,int balance){ Name = nombre; Balance = balance;}publictring Name {get;privateset;}publicint Balance {get;privateset;}}}

csharp

A partir del código anterior, definimos una clase de cuenta. En el método Main tenemos una colección de tipo Account y, mientras la recorremos, imprimimos los detalles de la cuenta actual en la consola, y luego añadimos un nuevo objeto Account a la colección. Si ejecutamos el programa tal como está, obtendremos el siguiente resultado.

1234567Colección a través de cuentas disponiblesJimmy Gradle tiene 900 dólaresSophie Gradle tiene 300 dólaresAñadiendo a Jeremy Brown a la colección...Oh no, algo salió malLa colección fue modificada; la operación de enumeración puede no ejecutarse.

Encontramos un error en el punto de añadir un nuevo artículo a la colección dentro de la declaración de la delantera. Esto se debe a que la declaración foreach, que se utiliza para iterar a los miembros de una colección, sólo permite leer o modificar los elementos individuales y no añadir o eliminar elementos de la colección. Para corregir el error que estamos obteniendo, porque no podemos añadir un elemento a una colección mientras la iteramos, usaremos la declaración for e iteraremos por su índice.

Actualice el código dentro del bloque de prueba con lo siguiente:

123456789101112131415161718var accounts =newList<Account;(){newAccount("Jimmy Gradle",900),newAccount("Sophie Gradle",300)};Console.WriteLine("Looping through available accounts");int count = accounts. Cuenta -1;for(int índice =0; índice <= cuenta; índice++){var cuenta = cuentas[índice]; Console.WriteLine("{0} tiene {1} dólares", cuenta.Nombre, cuenta.Saldo);if(cuenta.Nombre =="Sophie Gradle"){var newAccount =newAccount("Jeremy brown",1500); Console.WriteLine("Añadiendo {0} a la colección...
", newAccount.Name); accounts.Add(newAccount);}}

csharp

El arreglo fue separar la enumeración de la colección que está cambiando. Obtuvimos la cuenta de los artículos de la colección y la usamos para crear la declaración del bucle for. Cuando se ejecuta la aplicación, debería funcionar sin ningún error y emitir lo siguiente a la consola:

1234Colocando las cuentas disponiblesJimmy Gradle tiene 900 dólaresSophie Gradle tiene 300 dólaresAñadiendo a Jeremy Brown a la colección...