utilizar usuario try todas tipos programacion por para net más manejo manejar las excepciones específicos errores definidas comunes como catch capturar asp c# exception

c# - usuario - tipos específicos de excepciones más comunes en programacion



Un controlador de excepciones para todas las excepciones de una CLASE (6)

Esto suena como un problema con su diseño. ¿Puede explicar exactamente qué excepciones está tratando de detectar y por qué, y podemos intentarlo y ayudarlo?

Tengo una clase con varios métodos y quiero tener un controlador de excepciones para todos ellos. Hay tantos de estos métodos y tienen diferentes parámetros, que sería feo escribir try / catch para cada uno de ellos.

Tal vez conozca un modo en el que pueda hacerlo teniendo un controlador de excepción de clase, que los manejará a todos.

ACTUALIZAR:

Muchos de ustedes me preguntan por qué. La razón es que estoy llamando a una fuente de datos con varios métodos. así que mi clase tiene las funciones getData1, gedData2, getData3, getData4, ...., getDataN. El problema es que no hay forma de verificar si la conexión sigue abierta y la creación de una nueva conexión es muy costosa. Así que estoy intentando reutilizar la conexión y si la conexión en la próxima llamada ha fallado, lo detectaría, lo reconectaría y lo intentaría de nuevo. Es por eso que necesito este try / catch all block.

Para hacer esto para todas las funciones:

try{ datasource.getData() } catch(ConnectionException) { datasource.Connect(); datasource.getData() }

Gracias


Las excepciones no están realmente relacionadas con la clase, sino con el método / la pila de llamadas. Un objeto no debe, en general, tratar de manejar las excepciones de sus propios métodos. Depende de los que llaman de esos métodos.


No creo que haya. Podría mover el try / catch a la persona que llama, pero ese no es un diseño muy bueno. Puede ser mejor separarlo en otra clase y usar Reflexión para llamar a los métodos, como este:

public class MyClass {} public class MySafeClass { public void CallMethod(string name, object[] param) { Type t = typeof(MyClass); MyClass mc = new MyClass(); try { t.GetMethod(name).Invoke(mc, param); } catch { //...; } }

}

¡Pero no deberías! No es una buena práctica.

Otro método es usar try/catch pero tiene un método único para lanzar excepciones, etc. al usuario:

public class MyClass { void DoException(string message) { throw new Exception(message); } }

Pero esa todavía no es una buena opción.

No veo por qué sería feo, incluso si simplemente envuelve todo el método en un intento / captura con un mensaje. Eso podría ser factible.

También es una mejor opción dejarlos y pasarlos de nuevo a la persona que llama, tal vez en try/finally .

No es exactamente difícil probar / atrapar todo, especialmente con los fragmentos de Visual Studio y SharpDevelop.


No puedo descubrir ninguna razón por la que pueda beneficiarse de manejar todas las excepciones en una clase usando un solo método (¿podría explicarme? Tengo curiosidad ...)

De todos modos, puede utilizar las técnicas AOP (Programación Orientada a Aspectos) para inyectar (estáticamente o en tiempo de ejecución) el código de manejo de excepciones en torno a los métodos de su clase.

Hay una buena biblioteca de post-procesamiento de ensamblajes llamada PostSharp que puede configurar usando atributos en los métodos de su clase:

Puede definir un aspecto como este (del sitio web PostSharp):

public class ExceptionDialogAttribute : OnExceptionAspect { public override void OnException(MethodExecutionEventArgs eventArgs) { string message = eventArgs.Exception.Message; MessageBox.Show(message, "Exception"); eventArgs.FlowBehavior = FlowBehavior.Continue; } }

Y luego aplicará el atributo a los métodos que desea observar para excepciones, como esto:

public class YourClass { // ... [ExceptionDialog] public string DoSomething(int param) { // ... } }

También puede aplicar el atributo a toda la clase, de esta manera:

[ExceptionDialog] public class YourClass { // ... public string DoSomething(int param) { // ... } public string DoSomethingElse(int param) { // ... } }

Esto aplicará el consejo (el código de manejo de excepciones) a cada método en la clase.


Podría usar un delegado para pasar el código de su método a una captura de un solo intento como en el siguiente ejemplo:

private void GlobalTryCatch(Action action) { try { action.Invoke(); } catch (ExpectedException1 e) { throw MyCustomException("Something bad happened", e); } catch (ExpectedException2 e) { throw MyCustomException("Something really bad happened", e); } } public void DoSomething() { GlobalTryCatch(() => { // Method code goes here }); }


es posible que desee poner a prueba / atrapar su método principal, aunque considero que se trata de un grave uso indebido del manejo de excepciones, excepto que desea agregar un registrador o algo.