gpt4 book ai didi

c# - 我可以拥有强大的异常安全和事件吗?

转载 作者:太空狗 更新时间:2023-10-29 23:11:56 25 4
gpt4 key购买 nike

假设我有一个方法可以改变一个对象的状态,并触发一个事件来通知监听器这个状态改变:

public class Example
{
public int Counter { get; private set; }

public void IncreaseCounter()
{
this.Counter = this.Counter + 1;
OnCounterChanged(EventArgs.Empty);
}

protected virtual void OnCounterChanged(EventArgs args)
{
if (CounterChanged != null)
CounterChanged(this,args);
}

public event EventHandler CounterChanged;
}

即使 IncreaseCounter 成功完成状态更改,事件处理程序也可能抛出异常。所以我们没有强exception safety这里:

The strong guarantee: that the operation has either completed successfully or thrown an exception, leaving the program state exactly as it was before the operation started.

当您需要引发事件时,是否可以拥有强大的异常安全性?

最佳答案

为了防止处理程序中的异常传播到事件生成器,答案是在 try-catch 中手动调用 MultiCast Delegate(即事件处理程序)中的每个项目

所有处理程序都将被调用,异常不会传播。

public EventHandler<EventArgs> SomeEvent;

protected void OnSomeEvent(EventArgs args)
{
var handler = SomeEvent;
if (handler != null)
{
foreach (EventHandler<EventArgs> item in handler.GetInvocationList())
{
try
{
item(this, args);
}
catch (Exception e)
{
// handle / report / ignore exception
}
}
}
}

剩下的就是当一个或多个事件接收者抛出而其他事件接收者不抛出时,您要实现该做什么的逻辑。 catch() 也可以捕获特定异常并回滚任何更改(如果这是有意义的),从而允许事件接收者向事件源发出异常情况发生的信号。

正如其他人指出的那样,不推荐使用异常作为控制流。如果确实是特殊情况,那么一定要使用异常(exception)。如果您收到很多异常,您可能想使用其他东西。

关于c# - 我可以拥有强大的异常安全和事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/837366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com