¿Cuáles podrían ser las implicaciones de tener una función miembro setter en una clase de excepción? La motivación para tener un colocador es que a veces no hay suficientes datos disponibles en el punto de lanzamiento para manejar la excepción adecuadamente en el punto de captura; por lo que la información adicional debe agregarse cuando se desenrolla la pila.Setter en la clase de excepción
Respuesta
Si bien puedes diagnosticar la excepción original, preferiría la técnica utilizada en Java: captas el original y lanzas una nueva excepción que hace referencia al original como causa.
@Anon: y acabas de perder el marco de la pila ... –
@Matthieu: De acuerdo. Si lanza una nueva excepción, perderá la información de depuración de la pila. – Puppy
Incrustar el original podría exponerlo al problema de corte, si captura una clase base, pero la excepción detectada es algo derivado. Tendría que tirar y atrapar con el puntero, pero eso no es típico y crea algunos problemas propios. –
Antes que nada, parece una buena idea.
Uso SEH (manejo de excepciones específico de Windows, no relacionado con C++) en lugar de manejo de excepciones C++. Específicamente debido a esto, permite recopilar mucha más información antes de que comience el desenrollamiento de la pila.
Pero nunca he pensado en lanzar un tipo que "recopile" información.
Técnicamente hablando, no hay ningún problema. Sé cómo MSVC implementa el manejo de excepciones (hasta el nivel de ensamblador), y la idea no tiene nada de malo. Hay algunos puntos que deben mencionarse:
catch
El bloque se invoca después la pila se haya desenrollado. De modo que todo lo que está dentro del bloquetry
apropiado tiene ya destruido.- Al volver a tirar una excepción, se produce un gran golpe de rendimiento.
Supongo que el problema subyacente es que el código throwing (bajo nivel) no tiene tanto contexto/información como el código más arriba tendría.
Puede crear una nueva excepción que describa mejor la excepción, envolviendo la excepción original como una excepción interna. He hecho esto algunas veces, pero me doy cuenta de que esto no es práctico en todas las circunstancias.
Sé que algunos marcos tienen una propiedad de "Datos" que es más o menos un diccionario con datos arbitrarios. No me parece mal, aunque se abre para el abuso. Probablemente no debería usarse para tomar decisiones programáticas, debería ser para consumo humano.
Si algo capta la excepción y toma decisiones basadas en el parámetro X, podría volverse bastante complicado.
Mira la biblioteca Boost.Exception y más precisamente this page en el párrafo titulado Adición de datos arbitrarios a excepción Activo:
void parse_file(char const * file_name)
{
boost::shared_ptr<FILE> f = file_open(file_name,"rb");
assert(f);
try
{
char buf[1024];
file_read(f.get(), buf, sizeof(buf));
}
catch(boost::exception & e)
{
e << boost::errinfo_file_name(file_name);
throw;
}
}
Personalmente, creemos que la técnica muy eficaz. Modifique la excepción (agregando contexto) y vuelva a lanzar.
Contrariamente a Java, en C++ usted decide si incluye o no el marco de pila al construir su excepción, por lo que no corre el riesgo de perderlo y todavía se referirá al punto del código que arrojó la primera excepción, aunque tiene un contexto significativo.
Encontrarlo en Boost parece ser un buen respaldo de la técnica, incluso si no te gusta usar Boost. –
- 1. getter y setter para la clase en la clase C#
- 2. Uso de getter-setter dentro de la clase
- 3. excepción stackoverflow en la clase de formulario
- 4. clase de interfaz con getter y setter en C#
- 5. ¿Está marcada la clase de excepción java?
- 6. ¿Por qué extender la clase de excepción?
- 7. Java: Crear miembro de la clase estática cuyo constructor podría lanzar una excepción
- 8. clase fundido excepción
- 9. Boost.Python clase de excepción personalizada
- 10. Setter en la Unidad sin atributos
- 11. Problema con la anulación setter en ActiveRecord
- 12. ¿Cómo se puede curar la causa de la excepción de Hibernate "IllegalArgumentException ocurrió al llamar a setter"?
- 13. OOP: métodos getter/setter
- 14. Lista de propiedades Setter
- 15. evitar la generación de getter setter predeterminado
- 16. ¿Propiedad abstracta con getter público, define el setter privado en la clase concreta posible?
- 17. JAXB Excepción: Clase desconocida en este contexto
- 18. Agregar un método de la conciencia a la clase existente (Excepción de elenco de clase)
- 19. dapper PropInfo Setter para EntitySet heredado de la referencia de clase abstracta es nulo
- 20. Diagrama de clase de excepción Java?
- 21. Extraer clase y nombre de archivo de la excepción
- 22. StructureMap Setter Injection no establece la propiedad
- 23. Java: ¿clase de lanzamiento de excepción?
- 24. ¿Por qué devolver $ this en métodos setter?
- 25. EventTrigger con Setter en WPF?
- 26. Getter/setter en javascript array?
- 27. ¿Por qué recibo una excepción no detectada al implementar mis propios métodos KVC setter/getter
- 28. C#, Metro Application, clase de excepción personalizada
- 29. C# añadir la validación de un método setter
- 30. Omitir un Setter/Getter en Lombok
Suena como una idea razonable. – Jay
y qué código se ejecutará * mientras * la pila se está desenrollando? – Anon
Quiere decir en otro bloque catch. – Skurmedel