Mejor manera de mostrar mensajes de error en métodos asíncronos.
El hecho de que no podamos usar elawait
palabra clave encatch
bloques hace que sea bastante incómodo mostrar mensajes de error de métodos asíncronos en WinRT, ya queMessageDialog
API es asíncrona. Idealmente me gustaría poder escribir esto:
private async Task DoSomethingAsync()
{
try
{
// Some code that can throw an exception
...
}
catch (Exception ex)
{
var dialog = new MessageDialog("Something went wrong!");
await dialog.ShowAsync();
}
}
Pero en cambio tengo que escribirlo así:
private async Task DoSomethingAsync()
{
bool error = false;
try
{
// Some code that can throw an exception
...
}
catch (Exception ex)
{
error = true;
}
if (error)
{
var dialog = new MessageDialog("Something went wrong!");
await dialog.ShowAsync();
}
}
Todos los métodos que necesitan hacer esto tienen que seguir un patrón similar, lo que realmente no me gusta, porque reduce la legibilidad del código.
¿Hay una mejor manera de manejar esto?
EDITAR: Se me ocurrió esto (que es similar a lo que svick sugirió en sus comentarios):
static class Async
{
public static async Task Try(Func<Task> asyncAction)
{
await asyncAction();
}
public static async Task Catch<TException>(this Task task, Func<TException, Task> handleExceptionAsync, bool rethrow = false)
where TException : Exception
{
TException exception = null;
try
{
await task;
}
catch (TException ex)
{
exception = ex;
}
if (exception != null)
{
await handleExceptionAsync(exception);
if (rethrow)
ExceptionDispatchInfo.Capture(exception).Throw();
}
}
}
Uso:
private async Task DoSomethingAsync()
{
await Async.Try(async () =>
{
// Some code that can throw an exception
...
})
.Catch<Exception>(async ex =>
{
var dialog = new MessageDialog("Something went wrong!");
await dialog.ShowAsync();
});
}
.Catch<...>
Las llamadas pueden ser encadenadas para imitar múltiplescatch
bloques
Pero no estoy realmente contento con esta solución; La sintaxis es aún más incómoda que antes ...