【问题标题】:When to throw an exception and when to handle issue elegantly何时抛出异常以及何时优雅地处理问题
【发布时间】:2012-04-02 23:27:20
【问题描述】:

假设我有这个代码:

public void MyMethod(string Data, List<string> InputData)
{
  //I would assume throwing an exception for nulls would be correct
  if (String.IsNullOrWhiteSpace(Data) || InputData == null)
    throw new ArgumentNullException("Oops");

  if (InputData.Count == 0) 
    //throw exception or use event to raise a problem
    //throw Exception("Empty List")
    //if (DisplayError != null)
    //  DisplayError("Empty List");
}

现在有一个空列表并不是一个特殊的问题,所以我应该优雅地处理它。一种方法是引发事件来通知问题。只是让我想知道为什么我不只是在参数为空的情况下引发事件。

这类问题的最佳做法是什么?

事件处理程序示例:

public class MyOtherClass
{
  public event Action<string,List<string>> ItFired;

  public void DoSomething()
  {
     if(ItFired != null)
       ItFired(myString, myList);
  }
}

public class AnotherClass
{
     public void DoSomething()
     {
           var otherclass = new MyOtherClass();
           var myClass = new MyClass();

           otherClass.ItFired += myClass.MyMethod;
     }

}

【问题讨论】:

  • @Steve Gates:当您认为必须将空列表的情况作为一种特殊情况来处理时,那么这是一个特殊的问题。当然,这里可能有你想要使用事件而不是异常的原因,例如,当 MyMethod 本身是一个事件处理程序(或它的一部分)并且不应抛出任何异常时。但是因为性能原因争论这个——当你没有遇到任何真正的性能问题时——几乎总是一个完全错误的方法。

标签: c# .net design-patterns


【解决方案1】:

如果empty list 不是异常问题 在这种情况下不要引发异常Exceptions 用于特殊情况。在这种情况下,您可以只返回一些 boolean(比如说)值,这表明该函数未执行。

如果该函数的caller 是例外情况,那么它(调用者)将引发异常。

祝你好运。

【讨论】:

  • 该方法不返回任何内容,它是一个事件处理程序。我在空值等方面定义异常。如果我确实检查空列表,这不是异常只是一种痛苦,否则如果某些事情不太正确或者我应该抛出所有异常,我会到处抛出异常这些例外?
  • +1 还值得注意的是,控制常规程序流的异常非常慢 - 这是一个经常被忽视的性能问题,当您将它们用于实际问题时往往不会关心。
  • @AdamHouldsworth 非常正确,这就是我倾向于使用事件的原因
  • @SteveJobs:从函数中我看到它似乎不是 standart 事件处理程序。因此,您可能可以更改它的 delegate。在这种情况下,处理该事件的函数将能够与引发有关失败/成功事件的人进行通信。这可能是一些自定义的 事件参数(只是示例)
  • @Steve Gates:如果“空列表”不是一个例外情况 - 为什么它是一个需要错误显示或事件通知的问题? MyMethod 不能处理任意大小 n 的列表,其中 n=0 不是特殊情况?
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2013-07-24
  • 2011-11-26
  • 2021-05-26
相关资源
最近更新 更多