2011-12-19 18 views
6

Me falta algo ... ¿Cómo se puede lanzar una excepción, pero el código que sigue a la excepción todavía recibe un golpe en el depurador?¿Cómo se está ejecutando el código después de una excepción?

private UpdaterManifest GetUpdaterManifest() 
{ 
    string filePathAndName = Path.Combine(this._sourceBinaryPath, this._appName + ".UpdaterManifest"); 

    if (!File.Exists(filePathAndName)) 
    { 
     // This line of code gets executed: 
     throw new FileNotFoundException("The updater manifest file was not found. This file is necessary for the program to run.", filePathAndName); 
    } 

    UpdaterManifest updaterManifest; 

    using (FileStream fileStream = new FileStream(filePathAndName, FileMode.Open)) 
    { 
     // ... so how is it that the debugger stops here and the call stack shows 
     // this line of code as the current line? How can we throw an exception 
     // above and still get here? 
     XmlSerializer xmlSerializer = new XmlSerializer(typeof(UpdaterManifest)); 
     updaterManifest = xmlSerializer.Deserialize(fileStream) as UpdaterManifest; 
    } 

    return updaterManifest; 
} 
+1

Tal vez detectar la excepción más arriba en la cadena? –

+1

¿Quizás está viendo diferentes hilos? – Strillo

+0

¿Se accede a este código desde varios subprocesos? –

Respuesta

5

Algunos de escenario donde por regla general, puede suceder:

  • cuando la opción "Requerir archivos de origen para coincidir exactamente con la versión original" apagado. En ese caso, no recibirá una advertencia cuando sus archivos no estén sincronizados.

  • cuando el IDE pregunta por "Hubo errores de compilación. ¿Desea continuar y ejecutar la última compilación correcta?", en cuyo caso el IDE puede estar equivocado acerca de la línea correcta, porque ejecuta una versión anterior.

  • cuando está depurando una versión de lanzamiento de su código, donde se optimizan algunas partes. Esto da como resultado que la línea resaltada sea la siguiente línea disponible en la fuente que refleja y la declaración real en el código optimizado (esto se verá con frecuencia cuando se depura con ensamblados externos que están optimizados).


EDIT: tipo de malinterpretar el código. Entre el "tiro" y la línea que se resalta, solo hay una declaración de una variable, ningún código para ser ejecutado. Supongo que quisiste decir que el código "using ..." fue resaltado? Porque eso es lo que se esperaba: es la primera línea después de la declaración de lanzamiento (la declaración de lanzamiento en sí no "captura" el error para el depurador).

Ver Captura: enter image description here

+1

"Solicitar archivos de origen ..." está marcado. Además, no hay errores de compilación. No estoy depurando la versión de lanzamiento. Esto va a terminar siendo algo tonto, donde debería haberlo sabido, pero ahora estoy atascado. –

+0

Gracias, Abel. Esperaba que el bloque de catch fuera la siguiente línea que se muestra al presionar F10 en la instrucción throw. Como dijo Marc, tal vez es solo que el IDE está fuera de línea. Mi excepción se ve exactamente como lo has mostrado arriba. Una vez que toco F10 después de ese punto, me llevan correctamente al bloque catch. –

+0

Exactamente. Gracias. –

Cuestiones relacionadas