2010-05-21 28 views
6

Si tengo una cadena método como el siguiente:encadenamiento Método y excepciones en C#

 var abc = new ABC(); 
     abc.method1() 
      .method2() 
      .methodThrowsException() 
      .method3() 
      ; 

suponiendo he definido method1(), method2() y method3() como

public ABC method1() { 
     return this; 
    } 

y methodThrowsException() como

public ABC method3() { 
     throw new ArgumentException(); 
    } 

Al ejecutar el código, ¿es posible para saber qué línea específica de código arrojó la excepción, o simplemente considerará todo el método de encadenamiento como una sola línea? He hecho una prueba sencilla y parece que todos ellos considera como una sola línea, pero Method Chaining dice

métodos Poner en líneas separadas también hace más fácil la depuración de errores como mensajes y control depurador es por lo general en una línea por línea.

¿Echo de menos algo, o simplemente eso no se aplica a C#?

Gracias

Editar: aquí es lo que actualmente sale:

alt text http://img163.imageshack.us/img163/4503/83077881.png

+1

enlace de imagen ahora está roto se podría solucionar esto? – ahsteele

Respuesta

6

Si mira el stack trace, que se muestra como parte de los detalles de la excepción, debería ver la ubicación exacta de la excepción, sin importar cómo formatee el código.

Supongo que formatear el código de manera diferente sería útil si el depurador le permite poner un punto de interrupción en una línea específica, pero en C#, los puntos de interrupción se colocan en expresiones individuales, por lo que esto realmente no ayudará. Probablemente había necesidad de volver a escribir el código como este para permitir la colocación de puntos de ruptura:

var abc = new ABC(); 
var abc1 = abc.method1(); 
var abc2 = abc1.method2(); 
// etc... 

Lo mismo se aplica a destacar de la expresión actual (en la captura de pantalla). Sin embargo, la información exacta sobre la excepción siempre está disponible en el seguimiento de la pila.

1

El depurador VisualStudio (supongo que está utilizando VS y no Mono, Mono, ya no lo hace tener un depurador) conoce la línea real que está ejecutando su código, y no acumula todas las declaraciones al punto y coma más cercano, como tienden a hacer la mayoría de los depuradores de C/C++. Del mismo modo, incluso si coloca todas las declaraciones en la misma línea , VS puede mostrarle qué método se está ejecutando y cuál arrojó la excepción.

Editar: ¿De verdad tiene una excepción lanzada? Luego mira el rastro de pila de excepción.

+0

En realidad Mono tiene un depurador, pero es mucho menos poder que el de VS – abatishchev

+0

Sí, acabo de descubrirlo mirando su página. –

+0

Mira mi edición. –

1

Si ejecuta su código de ejemplo, verá que la línea informada en el seguimiento de la pila es en realidad la línea donde se lanza la excepción y no la línea de la llamada al método. El depurador VS también se detendrá en esta línea y no en la llamada a método.

Actualización: Como el error verde a la izquierda de su captura de pantalla indica que no se encuentra en la parte superior de la pila de llamadas. Abra la ventana Pila de llamadas (por ejemplo, a través del menú Depurar -> Windows -> Solicitud de pila) y haga doble clic en la primera línea para llegar al lugar donde se produce realmente la excepción. El primer método en la pila de llamadas también será method3().

Tenga en cuenta que la cita de Martin Fowler se refiere a la depuración en general, por lo que podría ser cierto para los IDEs de Java u otros depuradores integrados pero no para el IDE de Visual Studio. Sin embargo, podrá identificar fácilmente el método que causó el problema al observar el seguimiento de la pila de la excepción.

1

Usted puede ver la línea exacta de código en la que se generó la excepción, sino la línea de código que llama el método que lanza una excepción será 2 (véase la numeración de abajo)

  try { 

Line 1  var abc = new ABC(); 
Line 2  abc.method1() 
Line 3   .method2() 
Line 4   .methodThrowsException() 
Line 5   .method3(); 
Line 6 catch(Exception e) 
     { 
      StackTrace t = new StackTrace(e, true); 
     } 

El StackTrace (se puede verla ya sea en el StackTrace excepción o mediante la creación de un objeto StackTrace) contendrá 2 marcos:

  • la primera estará en la línea y presentar donde se define el método que lanza excepción

  • el segundo será en la línea 2

Cuestiones relacionadas