Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: d91 en 5 Octubre 2015, 05:06 am



Título: capturar exception en .net
Publicado por: d91 en 5 Octubre 2015, 05:06 am
hola a todos, solo quiero que me orienten de como capturar una excepcion que dispara oracle y que es una cadena, no las he podido controlar con el codigo de visual basic.net porque de la forma en que lo hago retornaria una cadena y la funcion donde tengo el try catch retorna un entero si la ejecucion es normal
Código
  1. public function ejecutasql() as integer
  2. try
  3. 'todo_bien en la consulta
  4. return 1
  5. Catch ex As OracleException
  6. Return "Error al generar Consulta" & ex.ToString
  7. End Try
  8.  
tambien he probado con esta otra pero igual no me controla la excepcion sino que de una vez me detiene la ejecucion
Código
  1. Catch ex As OracleException
  2.            Throw New ArgumentException("Error al generar consulta " & ex.Message.ToString)
  3.        End Try
  4.  


Título: Re: capturar exception en .net
Publicado por: Eleкtro en 5 Octubre 2015, 12:01 pm
quiero que me orienten de como capturar una excepcion que dispara oracle y que es una cadena, no las he podido controlar con el codigo de visual basic.net porque de la forma en que lo hago retornaria una cadena y la funcion donde tengo el try catch retorna un entero si la ejecucion es normal
Código
  1.  
  2. public function ejecutasql() as integer
  3.  
  4. ...
  5. return 1
  6.  
  7. Catch...
  8. Return "Error al generar Consulta" & ex.ToString
  9.  
  10. End Function

Si tienes una función cuyo valor de retorno es Integer, entonces pretender devolver un datatype distinto (String) es un error de concepto por parte del programador, y la solución más eficiente es tan sencilla como evitar querer hacer eso.

Explica detalladamente por que sientes la necesidad de devolver un string y un integer en una misma función, y así podré(mos) ofrecerte una solución apropiada a tus necesidades.

De todas formas... siempre puedes especificar un valor de retorno de tipo Object en lugar de Integer y hacer los castings necesarios al llamar a la función, pero esto lo considero malos hábitos de programación, no te recomiendo hacerlo.

Por último, decirte que considero que eso no debería ser una función, sino un método, ya que no necesitas devolver nada para evaluar un success/fail.

Saludos!


Título: Re: capturar exception en .net
Publicado por: Lekim en 5 Octubre 2015, 12:04 pm
Prueba esto:

Código
  1.        Try
  2.            Dim Resultado As IntPtr 'O Integer o lo que sea
  3.            ' Resultado = ...
  4.  
  5.  
  6.            Dim win32Err As Integer = System.Runtime.InteropServices.Marshal.GetLastWin32Error
  7.  
  8.  
  9.  
  10.            If Resultado = IntPtr.Zero Then  'Si Resultado  es un Stream o String debes poner  'If Resultado.Length = IntPtr.Zero Then'
  11.                Throw New System.ComponentModel.Win32Exception([error]:=win32Err)
  12.            Else
  13.  
  14.                'Variable/Control/Propiedad = Resultado
  15.  
  16.            End If
  17.  
  18.        Catch ex As Exception
  19.            Throw
  20.  
  21.        Finally
  22.            'Lo que quieras que haga al termintar...
  23.  
  24.        End Try


Pero si lo único que quieres es obtener el mensaje error entonces:

Código
  1.        Try
  2.  
  3.        Catch ex As Exception
  4.            MessageBox.Show(ex.Message)
  5.        End Try

ya que como dice Elektro devuelve un valor String


Título: Re: capturar exception en .net
Publicado por: Eleкtro en 5 Octubre 2015, 12:25 pm
Lekim, la función GetLastWin32Error es para el P/Invoking, solo se debe utilizar despues de llamar a una función no administrada (Windows API) y siempre que dicha función devuelva un código de error (no todas lo hacen por defecto), su propio nombre y la descripción lo indican por si mismo:

Cita de: https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.getlastwin32error%28v=vs.110%29.aspx
Returns the error code returned by the last unmanaged function that was called using platform invoke that has the DllImportAttribute.SetLastError flag set

Aparte de eso, en las funciones de la WinAPI que devuelvan un valor numérico, un valor de retorno tanto de "0" como distinto a "0" puede significar tanto un success como un tipo de error específico, es algo que depende de la función ya que no hay ningún estándar en ese sentido, cada función de la WinAPI es un mundo.

Aparte también, y solo por informar del siguiente dato, cabe mencionar que no existe una sincronización perfecta, como el nombre de la función explica por si mismo, esta se limita a devolver el último error Win32 conocido, ya sea el código de error devuelto por tu llamada, o sea el de otra llamada más reciente realizada por la aplicación.

Despues de esta pequeña aclaración, solo quiero aclarar que para controlar errores de miembros administrados (es decir, puro código .Net) se utiliza un bloque Try/Catch/Finally/End, nada más, por lo tanto el segundo código que has mostrado sería lo correcto :).

Saludos!


Título: Re: capturar exception en .net
Publicado por: d91 en 5 Octubre 2015, 13:43 pm
la razon de hacer una funcion que devuelva un entero es porque al hacer el excuteNonQuery me devuelve un 1 y entonces lo retorno hasta la pagina aspx para dar un mensaje de "Operacion exitosa", y segun la orientacion que me han dado esta funcion  hare  que retorne la cadena de  mensaje exitoso desde aqui para que tambien pueda devolver una cadena de error.


Título: Re: capturar exception en .net
Publicado por: d91 en 5 Octubre 2015, 13:48 pm
un ultimo detalle encontre ahora que cambio el tipo de retorno, dentro  de la misma clase donde tengo la funcion de ejecutar sql, tengo una que devuelve un dataset para llenar un dropdownlist, en esta funcion creo que no puedo cambiar el tipo de retorno para enviar el mensaje de error


Título: Re: capturar exception en .net
Publicado por: Eleкtro en 6 Octubre 2015, 04:13 am
la razon de hacer una funcion que devuelva un entero es porque al hacer el excuteNonQuery me devuelve un 1 y entonces lo retorno hasta la pagina aspx para dar un mensaje de "Operacion exitosa", y segun la orientacion que me han dado esta funcion  hare  que retorne la cadena de  mensaje exitoso desde aqui para que tambien pueda devolver una cadena de error.

Entonces, ¿no sería más apropiado hacer una función que devuelva un string, para cambiar el "1" por un "Operacion exitosa"?.

Código
  1. public function ejecutasql() as string
  2.  
  3. try
  4. 'todo bien en la consulta
  5. return "Operación exitosa"
  6.  
  7. catch ex As OracleException
  8. Return ("Error al generar Consulta: " & ex.Message)
  9.  
  10. end try
  11.  
  12. End Try

...De esa manera estarías haciendo las cosas mejor que devolver un integer y string.

Si necesitas rehutilizar ese código de error personalizado (1), entonces también podrías hacerlo de la siguiente manera:
Código
  1. public function ejecutasql() as keyvaluepair(of integer, string)
  2.  
  3. try
  4. 'todo bien en la consulta
  5. return new keyvaluepair(of integer, string)(1, "Operación exitosa")
  6.  
  7. catch ex As OracleException
  8. return new keyvaluepair(of integer, string)(0, ("Error al generar Consulta: " & ex.Message))
  9.  
  10. end try
  11.  
  12. End Try

Saludos


Título: Re: capturar exception en .net
Publicado por: d91 en 6 Octubre 2015, 13:30 pm
ya lo resolvi el problema es que solo habia trabajo con messageBox y ahora que requiere un mensaje sobre algun label de una aplicacion web no podia comprender lo del valor de retorno y la exception, gracias a todos