C# NET 5和6中的通用异步尝试捕获方法:最新技术?

C# NET 5和6中的通用异步尝试捕获方法:最新技术?,c#,.net-5,C#,.net 5,在.NET5或6中,最先进的方法是什么来实现一个通用的try/catch方法? 在这个问题上,5/6.NET的最佳实践是什么 用例: 我需要一个地方在try-catch中执行异步方法。 虚拟代码: private Task DoMyMethodeInTryCatch(MyMethod myMethodeAsParameter) { try { myMethodeAsParameter.Run();

在.NET5或6中,最先进的方法是什么来实现一个通用的try/catch方法? 在这个问题上,5/6.NET的最佳实践是什么

用例:

我需要一个地方在try-catch中执行异步方法。 虚拟代码:

private Task DoMyMethodeInTryCatch(MyMethod myMethodeAsParameter) 
{
            try
            {
                myMethodeAsParameter.Run();
            }
            catch (ExceptionHandlerOne e)
            {

            }
            catch (ExceptionHandlerTwo e)
            {

            }            
            catch (ExceptionHandlerTree e)
            {

            }
}
我想阻止的是这样的事情:

private void Methode1()
{
            try
            {
                DoStuffOne();
            }
            catch (ExceptionHandlerOne e)
            {

            }
            catch (ExceptionHandlerTwo e)
            {

            }            
            catch (ExceptionHandlerTree e)
            {

            }
}

private void Methode2()
{
            try
            {
                DoStuffTwo();
            }
            catch (ExceptionHandlerOne e)
            {

            }
            catch (ExceptionHandlerTwo e)
            {

            }            
            catch (ExceptionHandlerTree e)
            {

            }
}
我最后需要的是:

private void DoStuff()
{
    await DoMyMethodeInTryCatch(DoStuffOne); // DoStuffOne run in a try catch block
    await DoMyMethodeInTryCatch(DoStuffTwo); // DoStuffTwo run in a try catch block
}

如果
catch
块集是固定的,并且不依赖于
try
块内的任何变量/状态,则可以创建一个方法来执行
try
块中的操作:

async Task DoWork(Func<Task> a)
{
    try
    {
        await a();
    }
    catch (ExceptionHandlerOne e)
    { ... }
    catch (ExceptionHandlerTwo e)
    { ... }
    catch (ExceptionHandlerTree e)
    { ... }
}
如果希望获得返回值,则可以添加一个接受泛型参数的DoWork

async Task<T> DoWork<T>(Func<Task<T>> a)
{
    try
    {
        return await a();
    }

    // note, you will need to add return statements below if these catches don't throw

    catch (ExceptionHandlerOne e)
    { ... }
    catch (ExceptionHandlerTwo e)
    { ... }
    catch (ExceptionHandlerTree e)
    { ... }
}

您可以让fancier避免在处理程序中抛出异常(可能使用
dynamic
),但这是它的要点。

您希望在等待方法调用的地方使用try-catch。否则,请捕获AggregateException。
异步任务DomainMethodeIntrycatch(Func myMethodeAsParameter){try{await myMethodeAsParameter();}catch…}
?谢谢!这正是我想要的。谢谢你的回答!
async Task<T> DoWork<T>(Func<Task<T>> a)
{
    try
    {
        return await a();
    }

    // note, you will need to add return statements below if these catches don't throw

    catch (ExceptionHandlerOne e)
    { ... }
    catch (ExceptionHandlerTwo e)
    { ... }
    catch (ExceptionHandlerTree e)
    { ... }
}
async Task DoWork(Func<Task> a, IDictionary<Type, Action<Exception>> exceptionHandlers)
{
    try
    {
        await a();
    }
    catch (Exception e)
    {
        // this itself has no error handling... just here as an idea...
        exceptionHandlers[e.GetType](e);
    }
}