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?
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.
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.