Ayuda excepcion c#

Iniciado por Jeezy, 16 Abril 2018, 07:26 AM

0 Miembros y 2 Visitantes están viendo este tema.

Jeezy

Hola, estoy pasando un codigo de vb a c# y me sale una excepcion en este lugar

codigo vb:
Código (vbnet) [Seleccionar]
   Public Function SplitString(ByVal TheString As String, ByVal StringLen As Integer) As String()
       Dim ArrCount As Integer  'as it is declared locally, it will automatically reset to 0 when this is called again
       Dim I As Long  'we are going to use it.. so declare it (with local scope to avoid breaking other code)
       Dim TempArray() As String
       ReDim TempArray((Len(TheString) - 1) \ StringLen)
       For I = 1 To Len(TheString) Step StringLen
           TempArray(ArrCount) = Mid$(TheString, I, StringLen)
           ArrCount = ArrCount + 1
       Next
       SplitString = TempArray   'actually return the value
   End Function



codigo c#

Código (csharp) [Seleccionar]
           int Arrcount = new int();
           long I;
           string[] TempArray = new string[(TheString.Length -1) / (StringLen) + 1];
           for (I = 1; I <= TheString.Length; I += StringLen)
           {
               TempArray[Arrcount] = Strings.Mid(TheString, Convert.ToInt32(I), StringLen);
               Arrcount++;
           }
           return TempArray;


la excepcion me sale aqui en c#
string[] TempArray = new string[(TheString.Length -1) / (StringLen) + 1];
y es :

Excepción no controlada del tipo 'System.DivideByZeroException' en Kuroi Crypter.exe

Información adicional: Attempted to divide by zero.

Eleкtro

#1
Cita de: Jeezy en 16 Abril 2018, 07:26 AM
Excepción no controlada del tipo 'System.DivideByZeroException' en Kuroi Crypter.exe

Información adicional: Attempted to divide by zero.

Añade una condicional para verificar que el argumento de longitud no sea Cero, ni tampoco mayor que la longitud del string...

Código (csharp) [Seleccionar]
public string[] SplitString(string TheString, int StringLen) {

   if (StringLen <= 0) {
       throw new ArgumentOutOfRangeException("StringLen", "Value bigger than 0 is required.");

   } else if (StringLen >= TheString.Length) {
       throw new ArgumentOutOfRangeException("StringLen", "Value smaller than the source string length is required.");

   } else {
       int Arrcount = new int();
       long I;
       string[] TempArray = new string[(TheString.Length - 1) / (StringLen) + 1];
       for (I = 1; I <= TheString.Length; I += StringLen)
       {
           TempArray[Arrcount] = Strings.Mid(TheString, Convert.ToInt32(I), StringLen);
           Arrcount++;
       }
       return TempArray;

   }

}


Aparte de eso, si estás en C# no deberías depender de los miembros exclusivos de VB; en lugar de la función Mid puedes utilizar la función string.Substring()

y por favor la próxima vez utiliza las etiquetas GeShi para isnertar insertar bloques de código, estamos en un foro de programamación donde se requiere aplicar unas reglas mínimas de formato.

Saludos.








Jeezy

Elektro ya no me sale lo de condition zero epro ahora me sale esto

Excepción no controlada del tipo 'System.ArgumentOutOfRangeException' en Kuroi Crypter.exe

Información adicional: Value bigger than 0 is required.


justo aqui :
throw new ArgumentOutOfRangeException("StringLen", "Value bigger than 0 is required.");

disculpa si no pongo lo del GesHi pero soy nuevo en el foro y nose como colocarlo

Eleкtro

#3
Cita de: Jeezy en 16 Abril 2018, 16:57 PM
Elektro ya no me sale lo de condition zero epro ahora me sale esto

Excepción no controlada del tipo 'System.ArgumentOutOfRangeException' en Kuroi Crypter.exe

Información adicional: Value bigger than 0 is required.


justo aqui :
throw new ArgumentOutOfRangeException("StringLen", "Value bigger than 0 is required.");

Al parámetro StringLen le estabas pasando 0 (cero), de ahí la excepción DivideByZeroException que tenías, y entonces te dije de añadir una condicional para controlar esa excepción, y ahora te salta la excepción controlada por que sigues sin corregir el valor que le envías al parámetro StringLen de esa función... ¿entiendes a lo que me refiero?, deja de enviarle 0 al parámetro StringLen y solucionarás el problema...




Citarsoy nuevo en el foro y nose como colocarlo



Saludos








Jeezy

Disculpa pero soy nuevo programando y aun no entiendo todo correctamente , copie el codigo como me lo mandaste pero me sale la excepcion ArgumentOutOfRangeException en el primer if y me dijiste que aun no le habia corregido el valor a StringLen me podria ayduar la verdad que no entiendo todavia muy bien como arreglar esa excepcion


Eleкtro

#5
Cita de: Jeezy en 17 Abril 2018, 05:30 AMDisculpa pero soy nuevo programando y aun no entiendo todo correctamente

Dime si hay algo que no entiendas de esto:

- el funcionamiento y el propósito de esa función
- como debes realizar una llamada a esa función
- el propósito y el modo de empleo del parámetro StringLen

Citaren el primer if y me dijiste que aun no le habia corregido el valor a StringLen

En esto NO debes fijarte:
Citar
Código (csharp) [Seleccionar]
   if (StringLen <= 0) {
       throw new ArgumentOutOfRangeException("StringLen", "Value bigger than 0 is required.");

no hay nada malo en esas dos lineas, está todo correcto, es un simple control de errores.

A lo que yo me refiero con "corregir", es que debes corregir el valor que le pasas al parámetro StringLen al realizar la llamada a la función...

mira, tu debes estar haciendo algo parecido a esto:

Código (csharp) [Seleccionar]
SplitString("cadena de texto", 0);

...pero no puedes dividir la cadena de texto en cero, ese es el fallo, y el motivo por el cual se dispara esta excepción:
Citar
Código (csharp) [Seleccionar]
   if (StringLen <= 0) {
       throw new ArgumentOutOfRangeException("StringLen", "Value bigger than 0 is required.");

No hay mucho más que pueda hacer ni decir para ayudarte, ya te lo expliqué todo, pero intentaré decirlo de otro modo:
el problema es que le estás pasando el valor 0 al parámetro StringLen (cuando tú haces esto: SplitString("cadena de texto", 0);), y la solución es pasarle un número mayor que 0 y menor que la longitud total de la cadena de texto que quieras partir.

Si sigues sin entender cual es el motivo del error que estás tneiendo, creo que lo mejor sería que nos muestres el código donde estás intentando llamar a la función SplitString.

Saludos








Serapis

#6
Creo  que nuestro amigo, el problema que tiene es que no enrtiende que son los parámetros, para qué sirven... para eso, nada mejor que patear el lenguaje y a los puristas.

Veamos...
Jeezy, supongamos que tienes una casa, tienes una mesa pero le faltan las sillas, encuentra un carpintero (librería), que construye sillas (función), entonces tu quieres encargarle algunas sillas para tu mesa (invocar la función). El carpintero está muy ocupado, así que te deja un papel para que tú lo rellenes... ea, ese formulario sería como una función llamada "ConstruirSilla(...)", y te reclama que rellenes estos datos:
- Numero de sillas: Cuantas sillas quieres que te fabrique?
- Numero de patas: cuantas patas deben tener las sillas?
- Color de la pintura: Qué color de pintura deben llevar las sillas (usa0 si no quieres que las pinte)?
- Alto del asiento: A qué altura está situado con exactitud el asiento de la silla?
- Lleva un respaldo: Las sillas deben llevar asiento, o son más tipo taburete?
- Lleva cojín: han de llevar cojín las sillas...?
- Estilo: El estilo de la silla, a elegir entre una cantidad enumerada a la derecha, que se acompaña de foto.

Bien, pués cada una de esas cosas que te reclama se llaman parámetros (podrían ir más, pero el carpintero no quiere dar tanta libertad, que lo vuelva loco, o bien que luego resulte que le falte materiales para tus elecciones, o bien que le supongan caro contentar al cliente con otras elecciones), y son precisos para cumplir la funcionalidad, ya que de sus valores va a depender el resultado...
Ahora traduzcamos esa funcionalidad que el carpintero te ha presentado en un papel, para contratar la fabricación de unas sillas:


Funcion ConstruirSilla(entero NumSillas, byte NumPatas, entero Color, byte AlturaAsiento, buleano ConRespaldo, buleano ConCojin, enumeracion Estilos Estilo=EstiloDefecto)
... código para fabricar las sillas (dentro de la función)...
.... quizás como respuesta dé el precio de las sillas...
    devolver (PrecioUnitario * NumSillas)
Fin funcion


Ahora cuando 'llamemos a esa función', debemos indicar un valor VALIDO (dentro del rango admitido), para cada uno de esos parámetros obligatorios, porque es lo que nos pide el carpintero.
Supongamos que queremos 6 sillas, para nuestra mesa, y como es 'normal' la queremos de 4 patas, la mesa es de color 'miel', luego parece razonable que la queramos también en el mismo color (típicamente tendrá una tabla donde elegir el color, e indicar un número como referencia de ese color (o un string "miel", "blanco"...) supongamos que ese color es el 75247, luego queremos que lleve Respaldo, pero no necesitamos que tengan cojin, y el estilo de la silla, igualmente dispone de una tabla el que prefiramos y colocamos el número asociado a dicho estilo, imaginemos que es el 22.
Entonces ahora podemos invocar la función:


entero color = 75247
buleano cojin = FALSE
estilos e = 22
Preciototal = ConstruirSilla(6, 4, color, TRUE, cojin, e)


Como ves, hemos rellenado cada parámetro con el valor que hemos elegido, quizás si marcas en numPatas= 45, responda con un error, y diga que el númeor de patas admitida sea entre 1 (tipo taburete con un solo pie) y 6 (para sillas muy excéntricas), luego 45 se sale de lo que fabrica... el carpintero en persona al leer ese valor te llamaría por teléfono, para aclararte el tema.
Algunos parámetros los hemos rellenado con 'valor inmediato', otros en cambio hemos creado una variable del mismo tipo que es el parámetro, le hemos asignado un valor y la hemos entregado en el lugar donde se nos pide el parámetro. Es lo mismo entregar dinero en mano (valor inmediato), que entregar un cheque que supone el dinero (variable).

...y bueno, debería quedarte claro...sino, entonces es mejor que leas más, mucho más antes de ponerte a escribir código que no sabes interpretar.