none
desenvolver una excepción RRS feed

  • Pregunta

  • Buen día a todos.

    Tengo un método que recibe un objeto Exception.

    Este método puede ser invocado con cualquier tipo de excepción como argumento, SqlException, NotImplementedException, DivideByZeroException, etc.

    Mi necesidad es, una vez en el ámbito de mi método, convertir el parámetro de Exception al tipo correspondiente que puede ser SqlException, NotImplementedException, DivideByZeroException o cualquier otro.

    Con GetType obtengo el tipo pero no se como hacer la conversión.

    ¿Alguien sabe como conseguirlo?

    De antemano gracias

    lunes, 30 de diciembre de 2019 18:22

Respuestas

  • Hola JEduardonl

    No hace falta hacer ninguna conversión. El parámetro formal que recibe tu método es la clase base Exception, pero si vos le pasas como argumento, por ejemplo, un SqlException, dentro del método, el argumento (que funciona como una variable local) va a ser un SqlException, y de hecho por eso si le pedis GetType().Name te va a devolver SqlException. Eso se llama polimorfismo, creo, el hecho de que pones como genérico o como parámetro de un método una clase base, y luego los definís o le pasas el argumento como un objeto de la superclase o derivada. 


    Saludos

    Pablo

    lunes, 30 de diciembre de 2019 23:00
  • hola

    >>una vez en el ámbito de mi método, convertir el parámetro de Exception al tipo correspondiente que puede ser SqlException, NotImplementedException, DivideByZeroException o cualquier otro

    no se porque harias esto si con el catch puede diferenciar segun el tipo

    try{
    
        //codigo
    
    }catch(SqlException ex){
    
        //codigo
    
    }catch(NotImplementedException ex){
    
        //codigo
    
    }catch(DivideByZeroException ex){
    
        //codigo
    
    }

    esta seria la forma de trabajar la exception

    Ahora bien si tienes algun procesamiento especifico podrias usar la conversion como ser

    public void metodo1(Exception ex){
    
       SqlException sqlEx = ex as  SqlExceptio;
    
        if(sqlEx != null){
              //codigo
              return;
        }
    
       NotImplementedException notimpEx = ex as NotImplementedException;
    
        if(notimpEx  != null){
              //codigo
              return;
        }
    
       DivideByZeroException divZeroEx = ex as DivideByZeroException;
    
        if(divZeroEx != null){
              //codigo
              return;
        }
    
    }

    al usar el "as" casteas el objeto a un tipo, sino puede convertirlo dejara la variable en null

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 31 de diciembre de 2019 4:36
  • hola

    >>pero en realidad no es como dices.

    leiste la respuesta y el ejemplo que puse ? porque creo que no lo entendiste

    public void metodo1(Exception ex){
    
       SqlException sqlEx = ex as SqlException;
    
        if(sqlEx != null){
              string x = sqlEx.Server; 
              return;
        }
    
    
    
    }

    una vez que determinas que tipo de exception obtienes puedes acceder a la propiedad en concreto

    el "as" se usa para castear un tipo de dato a otro del cual hereda, solo que este no falla si es que no puede convertir, sino que deja la variable en null para poder evaluarla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 3 de enero de 2020 18:56
  • Gracias por la respuesta.

    Precisamente, como mencionas, tengo un procesamiento especifico algo así:

    public MyMethod(Exception exception)
    {
       ...
    }

    Pero no quiero llenarlo de ifs, uno para cada tipo de excepción por eso pienso que lo ideal es encontrar una forma de convertir mi parámetro al tipo correcto de excepción.

    Te agradeceré si tienes alguna otra sugerencia.

    viernes, 3 de enero de 2020 18:58
  • Sí entendí lo que propones, pero como menciono en la primer respuesta que diste, no quisiera llenar el método con un if para cada tipo de exception.

    Mi intención es convertir al tipo correcto una sola vez y que funcione para cualquier tipo, algo como esto:

    var x = (exception.GetType())exception;

    Claro que ese código no funciona, por eso acudo a la comunidad.

    De nuevo gracias y cualquier otra ayuda sera bienvenida.

    viernes, 3 de enero de 2020 19:11

Todas las respuestas

  • Hola JEduardonl

    No hace falta hacer ninguna conversión. El parámetro formal que recibe tu método es la clase base Exception, pero si vos le pasas como argumento, por ejemplo, un SqlException, dentro del método, el argumento (que funciona como una variable local) va a ser un SqlException, y de hecho por eso si le pedis GetType().Name te va a devolver SqlException. Eso se llama polimorfismo, creo, el hecho de que pones como genérico o como parámetro de un método una clase base, y luego los definís o le pasas el argumento como un objeto de la superclase o derivada. 


    Saludos

    Pablo

    lunes, 30 de diciembre de 2019 23:00
  • hola

    >>una vez en el ámbito de mi método, convertir el parámetro de Exception al tipo correspondiente que puede ser SqlException, NotImplementedException, DivideByZeroException o cualquier otro

    no se porque harias esto si con el catch puede diferenciar segun el tipo

    try{
    
        //codigo
    
    }catch(SqlException ex){
    
        //codigo
    
    }catch(NotImplementedException ex){
    
        //codigo
    
    }catch(DivideByZeroException ex){
    
        //codigo
    
    }

    esta seria la forma de trabajar la exception

    Ahora bien si tienes algun procesamiento especifico podrias usar la conversion como ser

    public void metodo1(Exception ex){
    
       SqlException sqlEx = ex as  SqlExceptio;
    
        if(sqlEx != null){
              //codigo
              return;
        }
    
       NotImplementedException notimpEx = ex as NotImplementedException;
    
        if(notimpEx  != null){
              //codigo
              return;
        }
    
       DivideByZeroException divZeroEx = ex as DivideByZeroException;
    
        if(divZeroEx != null){
              //codigo
              return;
        }
    
    }

    al usar el "as" casteas el objeto a un tipo, sino puede convertirlo dejara la variable en null

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 31 de diciembre de 2019 4:36
  • Gracias por responder pero en realidad no es como dices.

    Mi método es algo así:

    public MyMethod(Exception exception)
    {
       ...
    }

    Si dentro de MyMethod hago exception.GetType(), puedo obtener cualquier tipo, por ejemplo SqlException; pero si hago string x = exception.Server; obtengo un error ya que la propiedad Server es de la clase SqlException y exception es de la clase Exception, por esta razón la quiero convertir al tipo correspondiente.

    Espero haber sido claro en mi explicación.

    Agradeceré cualquier otro comentario o posible solución de tu parte 

    • Marcado como respuesta Pablo RubioModerator viernes, 3 de enero de 2020 21:22
    • Desmarcado como respuesta jeduardonl viernes, 3 de enero de 2020 21:24
    viernes, 3 de enero de 2020 18:51
  • hola

    >>pero en realidad no es como dices.

    leiste la respuesta y el ejemplo que puse ? porque creo que no lo entendiste

    public void metodo1(Exception ex){
    
       SqlException sqlEx = ex as SqlException;
    
        if(sqlEx != null){
              string x = sqlEx.Server; 
              return;
        }
    
    
    
    }

    una vez que determinas que tipo de exception obtienes puedes acceder a la propiedad en concreto

    el "as" se usa para castear un tipo de dato a otro del cual hereda, solo que este no falla si es que no puede convertir, sino que deja la variable en null para poder evaluarla

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 3 de enero de 2020 18:56
  • Gracias por la respuesta.

    Precisamente, como mencionas, tengo un procesamiento especifico algo así:

    public MyMethod(Exception exception)
    {
       ...
    }

    Pero no quiero llenarlo de ifs, uno para cada tipo de excepción por eso pienso que lo ideal es encontrar una forma de convertir mi parámetro al tipo correcto de excepción.

    Te agradeceré si tienes alguna otra sugerencia.

    viernes, 3 de enero de 2020 18:58
  • Sí entendí lo que propones, pero como menciono en la primer respuesta que diste, no quisiera llenar el método con un if para cada tipo de exception.

    Mi intención es convertir al tipo correcto una sola vez y que funcione para cualquier tipo, algo como esto:

    var x = (exception.GetType())exception;

    Claro que ese código no funciona, por eso acudo a la comunidad.

    De nuevo gracias y cualquier otra ayuda sera bienvenida.

    viernes, 3 de enero de 2020 19:11
  • >>Mi intención es convertir al tipo correcto una sola vez y que funcione para cualquier tipo

    eso no existe

    la unica forma de llevar varios objetos a una funcionalidad comun es si implementan o heredan de una misma clase o interfaz

    ahora si quiere acceder a funcionalidad especifica de cada tipo toca evaluar uno por uno los tipos y ver cual concreto se tiene para acceder a esa info

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 3 de enero de 2020 22:09