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

252
Vistas
Coincidencia de patrones C# 7

Supongamos que tengo el siguiente filtro de excepción

 try { ... } catch (Exception e) when (e is AggregateException ae && ae.InnerException is ValueException<int> ve || e is ValueException<int> ve) { ... }

Simplemente podría haber escrito dos bloques de catch separados, pero quería ver cómo se podría usar la función de coincidencia de patrones para capturar una excepción que es en sí misma o está envuelta dentro de una AggregateException . Aquí, sin embargo, el compilador se queja de una redefinición de ve , lo cual es comprensible. He visto un caso en el que se reutiliza una variable coincidente con un patrón dentro de la misma expresión que se muestra aquí: https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7- 0/

 if (o is int i || (o is string s && int.TryParse(s, out i)) { /* use i */ }

así que probablemente haya una manera de hacer lo que quiero. ¿O hay?

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

No puede declarar ve variables dos veces en el mismo ámbito. Pero puede reescribir el filtro de excepción para que la variable para ValueException<int> se declare solo una vez:

 catch(Exception e) when (((e as AggregateException)?.InnerException ?? e) is ValueException<int> ve) { // ... }

Es su one-liner para capturar la excepción si se lanzó directamente o si está envuelto en AggregateException .

Tenga en cuenta que el propósito de AggregateException es consolidar varias excepciones en un objeto de excepción. Podría haber varias excepciones internas, y algunas de ellas también pueden ser excepciones agregadas. Por lo tanto, debe aplanar la excepción agregada y verificar todas sus excepciones internas.


Puede poner la parte de 'desenvolver' en el método de extensión para mejorar la legibilidad de su código.

about 4 years ago · Santiago Trujillo Denunciar

0

No es tan agradable como la solución de Sergey, pero también puede usar diferentes nombres y combinarlos:

 try { ... } catch (Exception e) when (e is ValueException<int> ve1 || e is AggregateException ae && ae.InnerException is ValueException<int> ve2) { var exept = ve1 ?? ve2; // do something with exept }

si maneja las excepciones internas de ValueException o las excepciones generales de ValueException de la misma manera.

about 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