Manera de ver de forma automática qué funciones pueden devolver potencialmente excepción en C #

StackOverflow https://stackoverflow.com/questions/915941

  •  06-09-2019
  •  | 
  •  

Pregunta

nada más frustrante que ver a su desplome de código en el depurador en un método que exceptionned y que no intente / atraparlo.

¿Hay una manera fácil de explorar a través de sus fuentes y etiquetar todas las funciones que potencialmente puede lanzar excepciones?

¿La acumulación de ayuda visual tiene alguna opción oculta para dar color a estas funciones en un color específico?

gracias

R

¿Fue útil?

Solución

Creo Redgate tiene alguna herramienta para esta "excepción Hunter" Que cobran por ello después de un juicio.

http://www.red-gate.com/products/Exception_Hunter /index.htm

Otros consejos

Todo el código, pero el más trivial podría lanzar excepciones (de memoria, por lo menos). Usted es probablemente mejor de escribir el código de la defensiva, con al menos un try / catch mundial en lugar de tratar de microgestión de las secciones de código será o no lanzar excepciones.

No, no hay manera de hacer esto de forma automática ni hay una buena manera de obtener una lista de todas las posibles excepciones producidas por un método. Aquí hay algunas razones por las cuales

  1. Considere excepciones lanzadas implícitamente como StackOverflowException puede ser lanzado en cualquier momento y desde cualquier método. Usted debe asumir que cualquier método en el CLR puede lanzar este tipo de excepciones
  2. La reflexión y / o delegados pueden ocultar el código real que se llama en un método particular, por lo que no puede inspeccionar todas las posibles rutas de código de un método.
  3. Para ello sería necesario inspeccionar IL vs metadatos.
  4. En .Net no hay ningún requisito para documentar excepciones lanzadas explícitamente por una API

Como otros han dicho, no estoy seguro de si se puede encontrar una manera infalible de hacer esto en C #, ya no admite excepciones comprobadas.

Como un poco de un lado, esto me recordó una entrevista con Anders Hejlsberg discutir " El problemas con excepciones comprobadas ". No estoy tratando de llama excepciones marcada, pero lo que sugiere que lea razón de Ander detrás del diseño excepción de C # 's y la forma sugerida para el manejo de excepciones:. Manejo de excepciones centralizada

Creo que el ReSharper da pistas sobre excepciones. Pero debido a la razón de que C # no admite excepciones comprobadas, no hay manera de determinar las excepciones. Tal como herramientas de análisis de código NDepend apoyan esto.

Todo puede lanzar una excepción. Compruebe MSDN para obtener una lista de excepciones que puede ser lanzada por un método.

Todos los métodos no vacíos pueden lanzar excepciones en una forma u otra. Si usted está preocupado acerca de las excepciones que haya generado personalmente, puede mostrarlos de IntelliSense de la misma manera a través de métodos marco hacen documentación XML, así:

/// <summary>  
/// I seem to have written a method to do a thing.
/// </summary>  
/// <exception cref="System.Exception">An unfortunate failure.</exception>
public void DoSomething()
{
   /* ... */
}

Cualquier código podría causar una excepción es su trabajo para tratar de anticipar esto!

Hay una serie de herramientas de terceros que puedan ayudar a encontrar algunos errores comunes por ejemplo FxCop y herramientas como refactor puede hacer sugerencias.

Hay algunos trabajos se ha hecho en el momento en que le puede ayudar a encontrar posibles excepciones. Toma una vista de PEX que puede ayudar a generar pruebas para sus funciones: research.microsoft.com/en-us/projects/Pex/ (enlace parece estar abajo en el momento de la publicación)

Otra área interesante es contratos de código (que vienen en .NET 4 / disponibles en la espec #). contratos de código le permiten escribir afirmaciones que especifican las condiciones que deben cumplirse. Estos pueden ser, antes y después de su función de ser llamado y también se puede declarar invariantes. Una condición puede ser algo tan simple como valor! = Null. Estas condiciones son luego analizadas en compilación y de ejecución para comprobar ningún código caminos los violan.

Como los otros han dicho, se debe asumir que cada línea de código puede lanzar una excepción, a menos que se haya demostrado que no se puede. La mejor pregunta es, "¿qué va a hacer al respecto?"

En general, no debe ser la captura cualquier excepción en absoluto.

Por supuesto, todo lo demás es una excepción a esa regla. Tiene sentido para capturar una excepción con el fin de iniciar la sesión (si su entorno no hacer eso por usted, al igual que ASP.NET). Tiene sentido para capturar una excepción con el fin de sustituirla por otra excepción que proporciona más detalles sobre el contexto:

public int GetConfiguredInteger(string name) {
    string s = null;
    try {
        s = GetStringFromConfigFile(name);
    }
    catch (IOException ex) {
        throw new Exception(String.Format(
            "Error in configuration file foo.config when processing {0}", name),
            ex);
    }
    return int.Parse(s);
}

La persona que llama no podía saber que el IOException fue causado por un archivo de configuración si no les había dicho. Tenga en cuenta también cómo hice caso de todas las excepciones no relacionados con el archivo de E / S. En particular, cabe destacar que el int.Parse no es ni siquiera en el interior del bloque try / catch.

Hay un pequeño número de otras excepciones, pero la idea básica de la captura de excepciones es:. No lo haga a menos que sería peor si no lo hizo

Hay un reflector poner en Buscador de Excepción que mostrará qué excepciones podría ser lanzada por un método. No he utilizado, pero vio un ejemplo de ello en una reunión del grupo de usuarios .NET.

Hay una herramienta por ahí que puede hacer esto. Se podría descargar la prueba y ver si le gusta. Realmente no creo que sería tan necesario, pero si usted está trabajando para una empresa y que tendrá que pagar por lo que puede que desee ver en ella. Como se ha dicho antes, hay demasiadas excepciones posibles que se plantearon. Echa un vistazo a excpetion Hunter

Hunter excepción mencionada por algunas personas es una buena herramienta para ayudar con esto. No sé si tiene un tie-in con el comentario <exception> XML-Doc para que pueda cumplir la documentación de excepciones lanzadas por código.

Me resulta mucho más frustrante para romper el interior de un bloque catch exterior y cavar mi camino hasta el punto real en la excepción sucedió.

La mayoría de las veces, si ha generado una excepción y yo no esperaba que me encontré con un error y es más fácil de resolver si no se ofuscado por un manejo haciendo, no es una excepción.

EDIT: Desde sus ejemplos es en realidad una buena Todavía no estoy convencido de que esta herramienta le ayudaría. Habría tantas excepciones posibles que, literalmente, cada línea de código podría arrojar que tendría un momento difícil de encontrar los "interesantes".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top