Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

86
Vistas
Problemas de bloqueo Try-Catch-Finally con .NET4.5.1

Tengo un código de prueba simple que funciona como se esperaba en .NET3.5, pero el mismo código se comporta de manera completamente diferente en un proyecto creado con .NET4.5.1.

 class Program { static void Main(string[] args) { try { string a = null; var x = a.Length; } catch (Exception ex) { throw; } finally { Console.WriteLine("This is the finally block."); } Console.WriteLine("You should not be here if an exception occured!"); } }

En primer lugar, lo extraño es que la excepción de tipo NullReferenceException se ignora por completo en .NET4.5.1 cuando se ejecuta el archivo exe RELEASE compilado. Básicamente, no se lanza ningún error, aunque en el modo de depuración se lanza la excepción.

En segundo lugar (y lo más importante), si el error es diferente a NullReferenceException, como "índice fuera de rango", por ejemplo, entonces la excepción se lanza como se esperaba, pero el bloque "finalmente" nunca se golpea, que no es el comportamiento que esperaba del bloque try-catch-finally. Probé en diferentes máquinas, y otros 2 colegas míos también lo intentaron y todos obtuvimos el mismo resultado.

Parece que nunca entendí realmente el bloque try-catch-finally, o .NET4.5.1 maneja la excepción de una manera diferente, o hay algún error con .NET4.5.1. Todo lo que sé es que el código anterior funciona en .NET3.5 como esperaba que funcionara, pero parece que no obtengo el mismo resultado cuando lo ejecuto en .NET4.5.1.

¿Alguien puede arrojar algo de luz sobre esto? Estoy en una pérdida total en este momento.

EDITAR Basado en la respuesta de Eric J, pude resolver el problema de NullReferenceException. Ya que hice 2 preguntas, crearé un nuevo hilo para la segunda pregunta. Try-Catch-Finally bloquea problemas con .NET4.5.1

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

string a = null; var x = a.Length;

En el modo RELEASE, el jitter (compilador justo a tiempo) puede demostrar que nunca se hace referencia a x , por lo que puede eliminar la asignación.

En el modo DEBUG, el jitter no realiza esa optimización.

Para forzar el lanzamiento de la excepción, haga algo con x (por ejemplo, como sugiere @Henk en los comentarios, WriteLine(x) ).

EDITAR

Eric Lippert señaló en los comentarios.

... Estoy tan sorprendido como cualquiera de que el jitter elide una instrucción de longitud de cadena que podría arrojar. Eso me parece equivocado...

La optimización del jitter puede ser demasiado agresiva.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda