none
Como ocultar un error de excepcion Vb.net RRS feed

  • Pregunta

  • Buenos dias

    Necesito un poco de su ayuda con un error algo molesto y ya he realizado varios pasos para tartar de resolverlo.

    Tengo una aplicacion el cual se conecta a una base de datos de sql express y realiza ciertos procesos. Esta aplicacion funciona correctamente. El detalle que tengo es cada vez que el cpu entra en modo de sueño o hago el cambio de red cableada a wireless muestra el siguiente error. Se que esto se debe a que no detecta la conexion con la base de datos o se corta.

    Mi pregunta es si habra un modo para poder ocultar estos errors de desconexion. Les envio el codigo a continuación...

     Public Sub connectEnsRey()
            Try
                'test datasource bd. For this use a local database on your computer
                '------------------------------------------------------------------------------------------------
                          connStr = "Data Source=DBSERVER01; Initial Catalog=TUTITOS; User Id=DbUser; Password=Dbuser123;"
                '------------------------------------------------------------------------------------------------
                SqlConn = New SqlConnection(connStr)
                If SqlConn.State = ConnectionState.Broken Or SqlConn.State = ConnectionState.Closed Then
                    SqlConn.Open()
                    DbOK = True
                End If
                SqlConn.Close()
            Catch ex As SqlException
                Dim notif As New NotifyIcon
                notif.Visible = True
                notif.ShowBalloonTip(3000, "Caution", "Database Offline", ToolTipIcon.Error)
            Finally
                SqlConn.Close()
            End Try
        End Sub
    Y de antemano gracias por su ayuda.

    miércoles, 12 de julio de 2017 15:23

Respuestas

  • Hola: 

     Si no quieres ver el mensaje de error solo quita el codigo entre el Catch y el Finally que es que hace que se muestre el NotifyIcon


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marcado como respuesta FcoyClau miércoles, 12 de julio de 2017 16:37
    miércoles, 12 de julio de 2017 15:33
  • "FcoyClau" preguntó:

    > Mi pregunta es si habra un modo para poder ocultar estos errors
    > de desconexion. Les envio el codigo a continuación...
    >

    Hola:

    Si tu intención es que no se muestre error alguno aún habiéndose producido algún error, captura la excepción en el bloque Catch, tal cual lo estás haciendo, pero NO MUESTRES al usuario ningún mensaje de error, es decir, que te bastaría con comentar el código que se ejecuta en el bloque Catch:

     
          Catch 'ex As SqlException
               ' Capturar la excepción y no mostrar mensaje alguno
               ' Dim notif As New NotifyIcon
               ' notif.Visible = True
               ' notif.ShowBalloonTip(3000, "Caution", "Database Offline", ToolTipIcon.Error)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 12 de julio de 2017 15:35
    Moderador

Todas las respuestas

  • Hola: 

     Si no quieres ver el mensaje de error solo quita el codigo entre el Catch y el Finally que es que hace que se muestre el NotifyIcon


    Saludos desde Monterrey, Nuevo León, México!!!

    • Marcado como respuesta FcoyClau miércoles, 12 de julio de 2017 16:37
    miércoles, 12 de julio de 2017 15:33
  • "FcoyClau" preguntó:

    > Mi pregunta es si habra un modo para poder ocultar estos errors
    > de desconexion. Les envio el codigo a continuación...
    >

    Hola:

    Si tu intención es que no se muestre error alguno aún habiéndose producido algún error, captura la excepción en el bloque Catch, tal cual lo estás haciendo, pero NO MUESTRES al usuario ningún mensaje de error, es decir, que te bastaría con comentar el código que se ejecuta en el bloque Catch:

     
          Catch 'ex As SqlException
               ' Capturar la excepción y no mostrar mensaje alguno
               ' Dim notif As New NotifyIcon
               ' notif.Visible = True
               ' notif.ShowBalloonTip(3000, "Caution", "Database Offline", ToolTipIcon.Error)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 12 de julio de 2017 15:35
    Moderador
  • Como tu lo indicas no es la idea que el usuario tenga que ver estos errors por desconexion. Pero tampoco es bueno que el usuario tenga que ver este error todo este tiempo.

    Por fortuna encontre un modo mas amable de guardar estos errores en algun lado.

    Try
                'test datasource bd. For this use a local database on your computer
                '------------------------------------------------------------------------------------------------
                           connStr = "Data Source=DBSERVER01; Initial Catalog=TUTITOS; User Id=DbUser; Password=Dbuser123;"
                '------------------------------------------------------------------------------------------------
                SqlConn = New SqlConnection(connStr)
                If SqlConn.State = ConnectionState.Broken Or SqlConn.State = ConnectionState.Closed Then
                    SqlConn.Open()
                    DbOK = True
                End If
                SqlConn.Close()
            Catch ex As SqlException
                'Dim notif As New NotifyIcon
                'notif.Visible = True
                'notif.ShowBalloonTip(3000, "Caution", "Database Offline", ToolTipIcon.Error)
                'Environment.Exit(1)
                Dim path As String = Application.StartupPath & "\ErrorLog.Txt"
                Using sw As New StreamWriter(path, True)
                    ' If file exists, text will be appended ; otherwise a new file will be created
                    sw.Write(String.Format("Message: {0}<br />{1}StackTrace :{2}{1}Date :{3}{1}-----------------------------------------------------------------------------{1}", ex.Message, Environment.NewLine, ex.StackTrace, DateTime.Now.ToString()))
                End Using
            Finally
                SqlConn.Close()
            End Try

    Al parecer esta funcionando bien este modo y si el usuario reporta algun error, solo basta con ver el log creado.

    Gracias por su ayuda y saludos

    miércoles, 12 de julio de 2017 16:41
  • "FcoyClau" escribió:

    > Como tu lo indicas no es la idea que el usuario tenga que ver estos errors por desconexion.
    > Pero tampoco es bueno que el usuario tenga que ver este error todo este tiempo.
    >
    > Por fortuna encontre un modo mas amable de guardar estos errores en algun lado.
    >
    > Catch ex As SqlException
    >     Dim path As String = Application.StartupPath & "\ErrorLog.Txt"
    >     Using sw As New StreamWriter(path, True)
    >         sw.Write(String.Format("Message: {0}<br />{1}StackTrace :{2}{1}Date :{3}...
    >     End Using
    >

    Efectivamente, puedes aprovechar el bloque Catch para escribir en un archivo *.log los datos de la excepción generada de tal manera que ésta última sea transparente para el usuario.

    Ten en cuenta que hay multitud de circunstancias en las que se captura el error pero no se le muestra la información usuario, o al menos, no se le muestra tal cual aparece en la propiedad Message del objeto Exception, bien porque se personalice el mensaje de error o porque puede que no nos interese que el usuario conozca lo que realmente ha ocurrido.

    > Al parecer esta funcionando bien este modo y si el usuario reporta algun error, solo basta
    > con ver el log creado.

    Funcionará siempre y cuando el constructor del objeto StreamWriter no genere una excepción de las siete que puede generar, o su propio método Write no desencadene una excepción de las tres que también puede generar, por lo que yo te aconsejaría que encerraras el código del objeto StreamWriter entre un bloque Try ... Catch a fin de que la aplicación quede protegida ante cualquier excepción que produzca tanto el constructor del objeto StreamWriter como su método Write:

            Catch ex As SqlException
    
                Try
                    Dim path As String = Application.StartupPath & "\ErrorLog.Txt"
                    Using sw As New StreamWriter(path, True)
                        sw.Write(...)
                    End Using
    
                Catch
                    ' A los solo efectos de capturar la posible excepción que
                    ' pudiera haber desencadenado el objeto StreamWriter.
                End Try
    
             Finally
                 SqlConn.Close()
    
             End Try

     

    Obviamente, no introduzcas en el segundo bloque Catch información para escribir en el archivo *.log porque si se ha producido una excepción también se producirá en sucesivos intentos. Esto es solamente para proteger la aplicación ante excepciones no controladas si la cuenta del usuario no puede, por los motivos que sea, escribir en el archivo *.log en un primer intento. En éste caso, lo mismo tendrías que valorar si merece la pena continuar con la ejecución de la aplicación, porque si el usuario no puede escribir en un simple archivo de texto, igual tampoco puede acceder a la base de datos de SQL Server, por lo que utilizarías el segundo bloque Catch para dar por finalizada la ejecución de la aplicación digamos que de una "manera elegante". ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    miércoles, 12 de julio de 2017 17:13
    Moderador