繁体   English   中英

抛出异常时调用其他函数 - C# 代表

[英]calling the other functions when an exception is thrown - C# delegates

如果委托指向 5 个方法,则在调用委托时会在第一个方法中发生异常。 由于发生异常,无法调用 4 个函数的 rest。 即使发生异常,如何让委托调用其他函数

您需要使用Delegate.GetInvocationList基本上将委托拆分为单独的操作,并使用 catch 子句依次调用每个操作来处理异常。

例如:

Action[] individualActions = (Action[]) multicast.GetInvocationList();

foreach (Action action in individualActions)
{
    try
    {
        action();
    }
    catch (Exception e)
    {
        // Log or whatever
    }
}

当然,您可能只想捕获特定类型的异常。

您必须在 try/catch 块内自己调用(调用)订阅的处理程序。 您可以使用GetInvocationList()获取列表。

更好的解决方案需要控制处理程序:它们不应该抛出。

处理异常的粗略代码:

        foreach (Delegate handler in myDelegate.GetInvocationList())
        {
            try
            {
                object params = ...;
                handler.Method.Invoke(handler.Target, params);
            }
            catch(Exception ex)
            {
                // use ex
            }
        }

可能以下代码将帮助您了解如何做到这一点。

 public class DynamicInvocation
{
    public event EventHandler SomeEvent;
    public void DoWork()
    {
        //Do your actual code here
        //...
        //...
        //fire event here
        FireEvent();
    }

    private void FireEvent()
    {
        var cache = SomeEvent;
        if(cache!=null)
        {
            Delegate[] invocationList = cache.GetInvocationList();
            foreach (Delegate @delegate in invocationList)
            {
                try
                {
                    @delegate.DynamicInvoke(null);
                }
                catch
                {

                }
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM