none
Como devolver una Exepcion en una Funcion que devuelve un array de string RRS feed

  • Pregunta

  • Estimados Muchas bendiciones.

    Estoy haciendo un función que devuelve un array de string y dentro estoy manejando las excepciones obviamente con try catch y no se como devolver alguna excepción si se produce.

    Ej.

    Function devolverarray(byval dato as string) as string()
       
        Try
          'Codigo de la funcion
        Catch ex As Exception
            Return ex.Message.ToString()
         End Try
    
    End Funciton

    Espero me puedan ayudar.

    domingo, 25 de diciembre de 2016 1:12

Respuestas

  • "Negochile" preguntó:

    > Estoy haciendo un función que devuelve un array de string y dentro
    > estoy manejando las excepciones obviamente con try catch y no se
    > como devolver alguna excepción si se produce.
    >
    > Function devolverarray(byval dato as string) as string()
    >
    >    Try
    >      'Codigo de la funcion
    >    Catch ex As Exception
    >        Return ex.Message.ToString()
    >     End Try
    >
    > End Funciton

    Observando el "tratamiento de excepciones" que aparece en tu función, entiendo que NO ES NECESARIO que te preocupes de ello, porque la excepción la TENDRÁS QUE TRATAR en el código cliente que efectúe la llamada a la función "devolverarray", tal y como bien te ha explicado Willams Morales:

        Function DevolverArray(ByVal dato As String) As String()
    
            ' Codigo de la funcion
            '
            ' ...
    
            ' Devolver el valor que proceda
            Return ...
    
        End Function

    Y ahora, sería en el código llamador dónde tienes que atrapar la excepción y tratarla si así lo estimas conveniente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Llamar a la función
                Dim matriz As String() = DevolverArray("¡Hola Mundo!")
    
            Catch ex As Exception
                ' Se ha producido una excepción; mostrar el mensaje de error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Ahora bien. Si en lugar de devolver la excepción generada, deseas devolver una excepción particular, entonces sí tendrías que capturar la excepción en la propia función, y en el bloque Catch hacer uso de la instrucción Throw para lanzar tu propia excepción:

       Function DevolverArray(ByVal dato As String) As String()
    
            Try
                ' Codigo de la funcion
                '
                ' ...
    
                ' Devolver el valor que proceda
                Return ...
    
            Catch
                ' Se ha producido cualquier excepción. Generamos
                ' nuestra propia excepción particular.
    ' Throw New ArgumentException ("Se ha producido un error ... bla ... bla ... bla")
    End Try End Function

    Pero también sería en el código llamador donde tendrías que capturarla y tratarla si procede.

    Te aseguro que esto no ha cambiado respecto de versiones anteriores de Visual Basic. ¡Hombre! En Visual Basic 6.0 no existía el Try ... Catch ... Finally ... End Try, pero sí existía la instrucción On Error (que continua existiendo en Visual Basic .NET por motivos de compatibilidad con el código anterior, aunque NO SE RECOMIENDA su utilización en nuevos proyectos), donde también podías dejar que la excepción se propagara al código llamador, que sería finalmente donde la atraparas y tratarías si procediese. ;-)

    Un saludo y ¡Feliz Navidad!


    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.



    domingo, 25 de diciembre de 2016 8:53
    Moderador
  • "Negochile" preguntó:

    > al hacer:
    >
    >   Throw New ArgumentException ("Se ha producido un error ... bla ... bla ... bla")
    >
    > como lo trabajaría en el código llamador, seria como cuando se devuelve normal un
    > array unidimensional, o tendría que hacer algo especial

    Pero, ¿has leído la ayuda de la instrucción Throw?

    Throw es el mecanismo que tiene Visual Basic .NET para generar nuestras propias excepciones personalizadas. Es lo que equivale al método Raise del objeto Err de Visual Basic clásico:

        Generar una excepción personalizada

        VB 6.0:   Err.Raise(vbObjectError + 1514, "NombreAplicación", _
                        "Se ha producido un error ... bla ... bla ... bla.")

        VB NET:   Throw New ArgumentException ("Se ha producido un error ... bla ... bla ... bla")

    Y en el código llamador atraparías la excepción de igual manera que si hubiese sido generada por cualquier otro método de cualquier clase del marco de trabajo de .NET, es decir, encerrando la llamada al método, función, propiedad dentro de un bloque Try ... Catch ... End Try:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Llamar a la función
                Dim matriz As String() = DevolverArray("¡Hola Mundo!")
    
            Catch ex As Exception
                ' Se ha producido una excepción; mostrar el mensaje de error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Ahora bien, si a lo que te refieres en tu pregunta es a obtener cierta información del error producido a parte de su descripción, todo dependerá del tipo de excepción que se genere y cómo se encuentre ésta implementada en el código.

    Por ejemplo, una excepción del tipo System.ArgumentException no es más que otra clase de las muchas que nos proporciona .NET, y que deriva de la clase base System.Exception, que es la clase que proporciona la implementación básica sobre cualquier excepción producida.

    Pues tendrás que leer los valores de las propiedades de la clase ArgumentException para obtener más información sobre el error producido.

    Si deseas crear un tipo concreto de excepción personalizada, lo primero que tienes que hacer es crear una nueva clase que herede de la clase base System.Exception, e implementar las propiedades que estimes necesarias para que cuando se genere dicha excepción el cliente pueda tener la información que tú desees que tenga.

    Observa la firma del bloque Catch del ejemplo anterior:

        Catch ex As Exception

    La variable "ex" se encuentra definida con el tipo de dato System.Exception, que vuelvo a repetir es la clase base de todas los tipos definidos en .NET Framework, y de nuestras propias clases de excepciones personalizadas. Pues obtendrías información de la excepción producida consultado las propiedades de la clase Exception:

            Dim descripcion As String = ex.Message
            Dim origen As String = ex.Source
            Dim pilaLlamadas As String = ex.StackTrace

    En definitiva, que tienes que consultar las propiedades que nos proporciona la clase. Pero desde luego, no esperes encontrar un número de error de igual manera que se obtenía con el objeto Err de Visual Basic 6.0. ;-)

    También te digo que no te hace falta conocer el número del error, porque tan sólo tienes que conocer los tipos de excepción que puede devolver al cual has llamado. Para ello, en el código llamador puedes colocar tantos bloques Catch como posibles excepciones se puedan producir:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Llamar a la función
                Dim matriz As String() = DevolverArray("¡Hola Mundo!")
    
            Catch ex As InvalidOperationException
                ' Se ha producido una excepción cuando la llamada a un
                ' método no es válida para el estado actual del objeto;
                ' mostrar el mensaje de error
                MessageBox.Show(ex.Message)
    
            Catch ex As ArgumentNullException
                ' Se ha producido una excepción porque seguramente el
                ' valor pasado al método es Nothing; mostrar el mensaje
                ' de error
                MessageBox.Show(ex.Message)
    
            Catch ex As ArgumentException
                ' Se ha producido una excepción porque seguramente no es
                ' válido el valor pasado al método; mostrar el mensaje de
                ' Error
                MessageBox.Show(ex.Message)
    
            Catch ex As System.Data.SqlClient.SqlException
                ' Se ha producido una excepción generada por SQL Server;
                ' recorrer la colección Errors del objeto.
                '
                For Each err As System.Data.SqlClient.SqlError In ex.Errors
                    MessageBox.Show($"Número: {err.Number}, Descripción: {err.Message}")
                Next
    
            Catch ex As Exception ' --> ¡IMPORTANTE! Colocarlo en ÚLTIMA POSICIÓN.
                ' Se ha producido otro tipo de excepción diferente a las
                ' definidas anteriormente; mostrar el mensaje de error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Pero ¡cuidado! Si vas a utilizar un bloque Catch del tipo Exception, colócalo al final de todos los bloques Catch, porque como te he comentado antes, todas los tipos (clases) de excepciones derivan de la clase System.Exception, por lo que si ésta la colocas en el primer bloque Catch, éste será el bloque Catch que se ejecute, no sirviendo para nada que después coloques 20.000 bloques Catch para atrapar otros tantos tipos de excepciones diferentes a System.Exception. ¡Sí, ya lo sé, soy muy exagerado! ¡Que le vamos a hacer! ;-)

    Fíjate en el bloque Catch ex As System.Data.SqlClient.SqlException (un error producido por SQL Server). Ahí muestro cómo conocer el número y la descripción del error de SQL Server. Pero ello es posible porque el autor de la clase System.Data.SqlClient.SqlException se ha preocupado de implementar dentro de la misma una colección de objetos de la clase System.Data.SqlClient.SqlError, que son los que nos proporcionan la información sobre el número de error producido. Pero esto no significa que los restantes tipos de excepciones ofrezcan información sobre el número de error. ¡Eso son cosas del pasado! :-))

    Para más información sobre las excepciones, consulta los temas que aparecen en el siguiente enlace:

    Fundamentos del control de excepciones

    Ahí encontrarás información sobre cómo iniciar excepciones explícitamente y cómo crear excepciones definidas por el usuario.


    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.



    lunes, 26 de diciembre de 2016 7:18
    Moderador
  • Negochile,

    ¿El procedimiento Function DevolverArray() se encuentra en una biblioteca de clases?, de ser así una opción es dejar que la excepción se propague a las capas superiores (llamadoras) y en el nivel mas alto lo capturas:

    'Libreria de clases
    Function DevolverArray(ByVal dato As String) As String()
    
    	'Cuerpo del procedimiento
    	Return New String() {"Dato1", "Dato2", "Dato3"}
    
    End Function
    
    
    'Capa UI
    Try
    	Dim Datos As String() = DevolverArray("Dato")
    Catch ex As Exception
    	MessageBox.Show(ex.Message)
    End Try

    Otra manera es que el procedimiento Function retorne Nothing cuando ocurra una excepción, en la capa de UI se validará las acciones según el valor recibido:

    'Miembro de una ensamblado
    Function DevolverArray1(ByVal dato As String) As String()
    
    	Try
    		'Cuerpo del procedimiento
    		Return New String() {"Dato1", "Dato2", "Dato3"}
    	Catch
    		'En caso se produzca una excepción logear excepción
    		Return Nothing
    	End Try
    
    End Function
    
    'UI
    Dim Datos As string() = DevolverArray("Dato")
    
    If Datos IsNot Nothing Then
    	'Realizar acciones
    Else
    	MessageBox.Show("Ha ocurrido un error, comuníquese con el área de sistemas")
    End If

    La primera opción muestra el mensaje exacto que produce la excepción, en el segundo caso se enmascara el error por un mensaje general, el detalle de la excepción podría estar contenido en un archivo de log que se escribe al momento de producirse la excepción, queda a tu consideración. Como acotación final, una forma flexible de trabajar con un grupo de objetos es a través de colecciones, por ejemplo una lista (List<T>), una de las ventajas es que el número de elementos puede aumentar o reducir de manera dinámica.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 25 de diciembre de 2016 5:09
  • "Negochile" preguntó:

    > ... según lo que me dices entiendo que la excepción que se produzca en
    > esta función se elevara a la función que la utiliza y esta a su ves al
    > control que la ejecute subiendo la jerarquía. Esto es así Enrique.
    > o no entendí nada...

    Efectivamente, así es, como siempre ha sido. Como te indiqué en mi primera respuesta, esto no ha cambiado nada con respecto a versiones anteriores del lenguaje Visual Basic, ya que la excepción, o el error si lo prefieres, se propagará hacia los procedimientos o métodos llamadores anteriores hasta que se encuentre un bloque Try ... Catch ... End Try que capture la excepción producida. ¿Que no existe ningún bloque Catch para capturar la excepción? Pues entonces el programa se cerrará sin más, de una manera anómala, como ha sucedido siempre. ;-)

    ¡Feliz Año Nuevo!


    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.

    • Marcado como respuesta Negochile martes, 3 de enero de 2017 0:26
    domingo, 1 de enero de 2017 7:26
    Moderador

Todas las respuestas

  • Negochile,

    ¿El procedimiento Function DevolverArray() se encuentra en una biblioteca de clases?, de ser así una opción es dejar que la excepción se propague a las capas superiores (llamadoras) y en el nivel mas alto lo capturas:

    'Libreria de clases
    Function DevolverArray(ByVal dato As String) As String()
    
    	'Cuerpo del procedimiento
    	Return New String() {"Dato1", "Dato2", "Dato3"}
    
    End Function
    
    
    'Capa UI
    Try
    	Dim Datos As String() = DevolverArray("Dato")
    Catch ex As Exception
    	MessageBox.Show(ex.Message)
    End Try

    Otra manera es que el procedimiento Function retorne Nothing cuando ocurra una excepción, en la capa de UI se validará las acciones según el valor recibido:

    'Miembro de una ensamblado
    Function DevolverArray1(ByVal dato As String) As String()
    
    	Try
    		'Cuerpo del procedimiento
    		Return New String() {"Dato1", "Dato2", "Dato3"}
    	Catch
    		'En caso se produzca una excepción logear excepción
    		Return Nothing
    	End Try
    
    End Function
    
    'UI
    Dim Datos As string() = DevolverArray("Dato")
    
    If Datos IsNot Nothing Then
    	'Realizar acciones
    Else
    	MessageBox.Show("Ha ocurrido un error, comuníquese con el área de sistemas")
    End If

    La primera opción muestra el mensaje exacto que produce la excepción, en el segundo caso se enmascara el error por un mensaje general, el detalle de la excepción podría estar contenido en un archivo de log que se escribe al momento de producirse la excepción, queda a tu consideración. Como acotación final, una forma flexible de trabajar con un grupo de objetos es a través de colecciones, por ejemplo una lista (List<T>), una de las ventajas es que el número de elementos puede aumentar o reducir de manera dinámica.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 25 de diciembre de 2016 5:09
  • "Negochile" preguntó:

    > Estoy haciendo un función que devuelve un array de string y dentro
    > estoy manejando las excepciones obviamente con try catch y no se
    > como devolver alguna excepción si se produce.
    >
    > Function devolverarray(byval dato as string) as string()
    >
    >    Try
    >      'Codigo de la funcion
    >    Catch ex As Exception
    >        Return ex.Message.ToString()
    >     End Try
    >
    > End Funciton

    Observando el "tratamiento de excepciones" que aparece en tu función, entiendo que NO ES NECESARIO que te preocupes de ello, porque la excepción la TENDRÁS QUE TRATAR en el código cliente que efectúe la llamada a la función "devolverarray", tal y como bien te ha explicado Willams Morales:

        Function DevolverArray(ByVal dato As String) As String()
    
            ' Codigo de la funcion
            '
            ' ...
    
            ' Devolver el valor que proceda
            Return ...
    
        End Function

    Y ahora, sería en el código llamador dónde tienes que atrapar la excepción y tratarla si así lo estimas conveniente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Llamar a la función
                Dim matriz As String() = DevolverArray("¡Hola Mundo!")
    
            Catch ex As Exception
                ' Se ha producido una excepción; mostrar el mensaje de error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Ahora bien. Si en lugar de devolver la excepción generada, deseas devolver una excepción particular, entonces sí tendrías que capturar la excepción en la propia función, y en el bloque Catch hacer uso de la instrucción Throw para lanzar tu propia excepción:

       Function DevolverArray(ByVal dato As String) As String()
    
            Try
                ' Codigo de la funcion
                '
                ' ...
    
                ' Devolver el valor que proceda
                Return ...
    
            Catch
                ' Se ha producido cualquier excepción. Generamos
                ' nuestra propia excepción particular.
    ' Throw New ArgumentException ("Se ha producido un error ... bla ... bla ... bla")
    End Try End Function

    Pero también sería en el código llamador donde tendrías que capturarla y tratarla si procede.

    Te aseguro que esto no ha cambiado respecto de versiones anteriores de Visual Basic. ¡Hombre! En Visual Basic 6.0 no existía el Try ... Catch ... Finally ... End Try, pero sí existía la instrucción On Error (que continua existiendo en Visual Basic .NET por motivos de compatibilidad con el código anterior, aunque NO SE RECOMIENDA su utilización en nuevos proyectos), donde también podías dejar que la excepción se propagara al código llamador, que sería finalmente donde la atraparas y tratarías si procediese. ;-)

    Un saludo y ¡Feliz Navidad!


    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.



    domingo, 25 de diciembre de 2016 8:53
    Moderador
  • Enrique, bendiciones.

    al hacer:

       ThrowNewArgumentException ("Se ha producido un error ... bla ... bla ... bla")

    como lo trabajaría en el código llamador, seria como cuando se devuelve normal un array unidimensional, o tendría que hacer algo especial

    lunes, 26 de diciembre de 2016 1:08
  • "Negochile" preguntó:

    > al hacer:
    >
    >   Throw New ArgumentException ("Se ha producido un error ... bla ... bla ... bla")
    >
    > como lo trabajaría en el código llamador, seria como cuando se devuelve normal un
    > array unidimensional, o tendría que hacer algo especial

    Pero, ¿has leído la ayuda de la instrucción Throw?

    Throw es el mecanismo que tiene Visual Basic .NET para generar nuestras propias excepciones personalizadas. Es lo que equivale al método Raise del objeto Err de Visual Basic clásico:

        Generar una excepción personalizada

        VB 6.0:   Err.Raise(vbObjectError + 1514, "NombreAplicación", _
                        "Se ha producido un error ... bla ... bla ... bla.")

        VB NET:   Throw New ArgumentException ("Se ha producido un error ... bla ... bla ... bla")

    Y en el código llamador atraparías la excepción de igual manera que si hubiese sido generada por cualquier otro método de cualquier clase del marco de trabajo de .NET, es decir, encerrando la llamada al método, función, propiedad dentro de un bloque Try ... Catch ... End Try:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Llamar a la función
                Dim matriz As String() = DevolverArray("¡Hola Mundo!")
    
            Catch ex As Exception
                ' Se ha producido una excepción; mostrar el mensaje de error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Ahora bien, si a lo que te refieres en tu pregunta es a obtener cierta información del error producido a parte de su descripción, todo dependerá del tipo de excepción que se genere y cómo se encuentre ésta implementada en el código.

    Por ejemplo, una excepción del tipo System.ArgumentException no es más que otra clase de las muchas que nos proporciona .NET, y que deriva de la clase base System.Exception, que es la clase que proporciona la implementación básica sobre cualquier excepción producida.

    Pues tendrás que leer los valores de las propiedades de la clase ArgumentException para obtener más información sobre el error producido.

    Si deseas crear un tipo concreto de excepción personalizada, lo primero que tienes que hacer es crear una nueva clase que herede de la clase base System.Exception, e implementar las propiedades que estimes necesarias para que cuando se genere dicha excepción el cliente pueda tener la información que tú desees que tenga.

    Observa la firma del bloque Catch del ejemplo anterior:

        Catch ex As Exception

    La variable "ex" se encuentra definida con el tipo de dato System.Exception, que vuelvo a repetir es la clase base de todas los tipos definidos en .NET Framework, y de nuestras propias clases de excepciones personalizadas. Pues obtendrías información de la excepción producida consultado las propiedades de la clase Exception:

            Dim descripcion As String = ex.Message
            Dim origen As String = ex.Source
            Dim pilaLlamadas As String = ex.StackTrace

    En definitiva, que tienes que consultar las propiedades que nos proporciona la clase. Pero desde luego, no esperes encontrar un número de error de igual manera que se obtenía con el objeto Err de Visual Basic 6.0. ;-)

    También te digo que no te hace falta conocer el número del error, porque tan sólo tienes que conocer los tipos de excepción que puede devolver al cual has llamado. Para ello, en el código llamador puedes colocar tantos bloques Catch como posibles excepciones se puedan producir:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Llamar a la función
                Dim matriz As String() = DevolverArray("¡Hola Mundo!")
    
            Catch ex As InvalidOperationException
                ' Se ha producido una excepción cuando la llamada a un
                ' método no es válida para el estado actual del objeto;
                ' mostrar el mensaje de error
                MessageBox.Show(ex.Message)
    
            Catch ex As ArgumentNullException
                ' Se ha producido una excepción porque seguramente el
                ' valor pasado al método es Nothing; mostrar el mensaje
                ' de error
                MessageBox.Show(ex.Message)
    
            Catch ex As ArgumentException
                ' Se ha producido una excepción porque seguramente no es
                ' válido el valor pasado al método; mostrar el mensaje de
                ' Error
                MessageBox.Show(ex.Message)
    
            Catch ex As System.Data.SqlClient.SqlException
                ' Se ha producido una excepción generada por SQL Server;
                ' recorrer la colección Errors del objeto.
                '
                For Each err As System.Data.SqlClient.SqlError In ex.Errors
                    MessageBox.Show($"Número: {err.Number}, Descripción: {err.Message}")
                Next
    
            Catch ex As Exception ' --> ¡IMPORTANTE! Colocarlo en ÚLTIMA POSICIÓN.
                ' Se ha producido otro tipo de excepción diferente a las
                ' definidas anteriormente; mostrar el mensaje de error
                MessageBox.Show(ex.Message)
    
            End Try
    
        End Sub

    Pero ¡cuidado! Si vas a utilizar un bloque Catch del tipo Exception, colócalo al final de todos los bloques Catch, porque como te he comentado antes, todas los tipos (clases) de excepciones derivan de la clase System.Exception, por lo que si ésta la colocas en el primer bloque Catch, éste será el bloque Catch que se ejecute, no sirviendo para nada que después coloques 20.000 bloques Catch para atrapar otros tantos tipos de excepciones diferentes a System.Exception. ¡Sí, ya lo sé, soy muy exagerado! ¡Que le vamos a hacer! ;-)

    Fíjate en el bloque Catch ex As System.Data.SqlClient.SqlException (un error producido por SQL Server). Ahí muestro cómo conocer el número y la descripción del error de SQL Server. Pero ello es posible porque el autor de la clase System.Data.SqlClient.SqlException se ha preocupado de implementar dentro de la misma una colección de objetos de la clase System.Data.SqlClient.SqlError, que son los que nos proporcionan la información sobre el número de error producido. Pero esto no significa que los restantes tipos de excepciones ofrezcan información sobre el número de error. ¡Eso son cosas del pasado! :-))

    Para más información sobre las excepciones, consulta los temas que aparecen en el siguiente enlace:

    Fundamentos del control de excepciones

    Ahí encontrarás información sobre cómo iniciar excepciones explícitamente y cómo crear excepciones definidas por el usuario.


    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.



    lunes, 26 de diciembre de 2016 7:18
    Moderador
  • Enrique Bendiciones.

    Gracias por tu acuciosa respuesta, y perdona la dureza de mi ignorancia.

    Esta función no la llamo o utilizo desde un botón u otro componente la requiero desde otra función, bueno de varias otras funciones y sub procesos, por eso preguntaba que pasaba al producirse una excepción dentro de esta función que devolvía una matriz de string, pero según lo que me dices entiendo que la excepción que se produzca en esta función se elevara a la función que la utiliza y esta a su ves al control que la ejecute subiendo la jerarquía. Esto es así Enrique. o no entendí nada...

    sábado, 31 de diciembre de 2016 18:05
  • "Negochile" preguntó:

    > ... según lo que me dices entiendo que la excepción que se produzca en
    > esta función se elevara a la función que la utiliza y esta a su ves al
    > control que la ejecute subiendo la jerarquía. Esto es así Enrique.
    > o no entendí nada...

    Efectivamente, así es, como siempre ha sido. Como te indiqué en mi primera respuesta, esto no ha cambiado nada con respecto a versiones anteriores del lenguaje Visual Basic, ya que la excepción, o el error si lo prefieres, se propagará hacia los procedimientos o métodos llamadores anteriores hasta que se encuentre un bloque Try ... Catch ... End Try que capture la excepción producida. ¿Que no existe ningún bloque Catch para capturar la excepción? Pues entonces el programa se cerrará sin más, de una manera anómala, como ha sucedido siempre. ;-)

    ¡Feliz Año Nuevo!


    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.

    • Marcado como respuesta Negochile martes, 3 de enero de 2017 0:26
    domingo, 1 de enero de 2017 7:26
    Moderador
  • Gracias Enrique...

    me encantaría poder tener comunicación directa con tigo... Bendiciones

    martes, 3 de enero de 2017 0:27