Это потому, что вы возвращаете задачу, возвращенную из параметра Func<TOut> action
напрямую. Это означает, что задача не может быть выполнена внутри try / catch в TryCatchErrors. На данный момент он работает только как прокси, передавая задачу вызывающей стороне.
Сделайте это asyn c и дождитесь его там. Делая это asyn c и ожидая его внутри метода, вы делаете его частью машины состояний. Так что try / catch также будет частью этого.
public async static TOut TryCatchErrors<TLogger, TOut>(ILogger<TLogger> logger, Func<TOut> action, string? customMsg = null)
{
try
{
if (logger == null) { throw new ArgumentNullException($"Got null for logger", $"Expected type ILogger<{typeof(TLogger).AssemblyQualifiedName}>!"); }
if (action == null) { throw new ArgumentNullException($"Got null for action", $"Expected type Func<{typeof(TOut).AssemblyQualifiedName}>!"); }
await action.Invoke();
}
catch (Exception e)
{
logger.LogError(e, customMsg ?? e.Message);
}
}
Я не проверял это, но я думаю, что вы должны изменить сигнатуру методов на:
public async static Task<TOut> TryCatchErrors<TLogger, TOut>(ILogger<TLogger> logger, Func<Task<TOut>> action, string? customMsg = null)
{
try
{
if (logger == null) { throw new ArgumentNullException($"Got null for logger", $"Expected type ILogger<{typeof(TLogger).AssemblyQualifiedName}>!"); }
if (action == null) { throw new ArgumentNullException($"Got null for action", $"Expected type Func<{typeof(TOut).AssemblyQualifiedName}>!"); }
await action.Invoke();
}
catch (Exception e)
{
logger.LogError(e, customMsg ?? e.Message);
}
}
, иначе вы Вам, вероятно, не позволено его ждать.