c# - 为什么异常会传播出事件处理程序?

标签 c# exception events exception-handling event-handling

考虑以下程序。它显示的行为(即异常将从事件处理程序传播出去)如何成为“好事”?据我所知,它只会很糟糕。从不应该出现的函数中弹出意外异常。在我的特殊情况下,它正在杀死线程。那么,这种行为在某些情况下实际上是一件好事吗?这是说让事件处理程序中出现异常是糟糕的设计的理由吗?

static class Program {
    static void Main()
    {
        Foo foo = new Foo();
        foo.SomeEvent += ThrowException;

        try 
        {
            foo.OnSomeEvent();
        } 
        catch (Exception) 
        {
            // This is printed out
            Console.WriteLine("Exception caught!");
        }
    }

    static void ThrowException(object sender, EventArgs e)
    {
        throw new Exception();
    }
}

// Define other methods and classes here
class Foo 
{
    public event EventHandler SomeEvent;

    public void OnSomeEvent()
    {
        SomeEvent(this, EventArgs.Empty);
    }
}

最佳答案

您的首选替代方案是什么 - 默默吞下异常?我根本不喜欢这样。

事件只是一种实现观察者模式的方式,真的。如果监听器抛出异常,我绝对希望将该异常返回给调用者。我能想到的任何其他行为都会有效地将异常视为不重要。异常(exception)的全部意义在于,当出现问题时,您会迅速而隐含地发现它。您必须显式处理异常,这样您就不会在没有意识到的情况下在损坏的状态中继续您的快乐之路。

关于谁负责处理异常,您提出了一个有效的观点。从广义上讲,我发现最好假设几乎任何事情都可以随时抛出异常。除了我知道可能会发生特定异常的特殊情况并且我可以处理它,我通常不会在顶层以外的地方捕获异常——除非可能包装并重新抛出,或者记录并重新抛出.

现在有可能您的某个事件处理程序确实不应该抛出异常 - 它们并没有真正遇到错误情况 - 但如果这是一个完全合理的异常应该发生什么这表明一个严重的问题?虽然程序崩溃是丑陋的,但它通常比继续其中一些故障、可能损坏持久状态等要好。

从根本上说,我认为 CS/SE 领域的错误处理还没有“正确”。我什至不确定是否有一种优雅的方式来做正确的事情,在所有情况下都可以简单地表达...但我希望目前的情况不会像现在这样好.

关于c# - 为什么异常会传播出事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1157512/

相关文章:

python - 输入通知事件信号不适用于 gtk.ToolButton

c# - C#中的触发事件

c# - 在 Html.DropDownlistFor 中获取多个选定值

c# - 为什么我的 C# 对象在实例化后为 null? (或者我做得不对?)

c++ - 自定义异常中的损坏消息

php - 我将如何使用 PHP 异常来定义重定向?

c# - c#中event关键字的使用

c# - C#事件的奇怪之处

c# - 将 Entity Framework Core 实体转换为 SQL 字符串

java - 异常:ClassNotFoundException & NoClassDefFoundError At Release Run Application