Проброс исключения наверх в асинхронном коде

У меня ASP.NET Core приложение. Мне нужно реализовать отправку почты. Есть простой EmailService с одним async методом, в нем происходит примерно следующее

await client.ConnectAsync(smtpOptions.Server, smtpOptions.Port, SecureSocketOptions.StartTls);
await client.AuthenticateAsync(smtpOptions.Login, smtpOptions.Password);
await client.SendAsync(message);
await client.DisconnectAsync(true);

И дальше в контролере я использую этот сервис. Но я хочу сделать обработку ошибок. Каждый из методов ConnectAsync, SendAsync и.т.д может кинуть эксепшн(DisconnectAsync судя по доке кидает эксепшн только при неправильном использовании) и там разные типы эксепшнов. Но в любом из этих случаев(или не подключился или аутентификация не пройдена или все было нормально, но письмо не отправилось) результат один - почта не отправилась. Потому я хочу обернуть это в try catch, но наверх пробросить какое-то одно исключение, которое будет означать что операция не выполнилась успешно, чтобы в контроллере ловить единственный тип эксепшна. Правильно ли это и какой тип эксепшна кидать наверх из стандартных ? Вот так примерно хочу сделать.

// внутри метода Send в сервисе EmailService
try
{
    await client.ConnectAsync(smtpOptions.Server, smtpOptions.Port, SecureSocketOptions.StartTls);
    await client.AuthenticateAsync(smtpOptions.Login, smtpOptions.Password);
    await client.SendAsync(message);
    await client.DisconnectAsync(true);
}
catch (Exception) {
    throw new OperationWasNotDone();
}

// а в контролере уже
try
{
    await emailService.SendAsync(...);
}
catch (SomeExceptionType)
{
    return SomeErrorCode();
}

Ответы (0 шт):