以通用方式在委托中捕获异常

问题描述 投票:0回答:1

我需要帮助来识别捕获调用该委托时从该委托中引发的异常的一般方法。当前,当我调用传递给另一个“ master”方法的委托(在本例中为func)并从委托内引发异常时,该调用周围代码中的try / catch不会捕获该异常。简化示例:

https://dotnetfiddle.net/WNbGMb

[就像我上面说过的那样,从try / catch不会捕获从clientOperation委托内部抛出的任何异常。此代码在整个应用中的数百个位置中使用,很少有(如果有的话)在委托中捕获异常(因为其他程序员错误地认为将捕获由委托抛出的异常)。有没有办法在不大量重构每个委托以捕获异常的情况下捕获这些委托内部抛出的异常?

c# exception delegates
1个回答
0
投票

问题与委托本身无关。在您的小提琴中,您不必等待委托返回的Task完成。基本上,委托将返回Task并且该方法将继续。在有问题的原始代码中:

try
{
    // Execute the requested action.
    retval = clientOperation.Invoke(remoteObj);
}
catch(ex)
{
    // log here.
}
finally
{
    CloseChannel(remoteObj);        
}

它将直接跳转到finally子句并尝试关闭连接。您需要分别处理Func的返回任务:

public void HandleDelegateEx<T>(Func<T> a)
{
    try
    {           
        a.Invoke();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

public async Task HandleDelegateExAsync<T>(Func<Task<T>> a)
{
    try
    {
        await a.Invoke();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}

HandleDelegateEx<int>(() => throw new Exception("test")); // prints "test"
Func<Task<int>> func = () => Task.FromException<int>(new Exception("test async"));
HandleDelegateEx(func); // does not print anything
await HandleDelegateExAsync(func); // prints "test async"
© www.soinside.com 2019 - 2024. All rights reserved.