C# NET 5和6中的通用异步尝试捕获方法:最新技术?
在.NET5或6中,最先进的方法是什么来实现一个通用的try/catch方法? 在这个问题上,5/6.NET的最佳实践是什么 用例: 我需要一个地方在try-catch中执行异步方法。 虚拟代码: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();
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);
}
}