异常构造函数是否应该抛出异常?

时间:2018-11-05 20:40:21

标签: c# exception exception-handling try-catch

应该允许异常的构造方法引发异常吗?

示例:

public class MyException : Exception
{
   public List<string> Errors { get; private set; }

   public MyException(List<string> errors)
   {
      if(errors == null)
      {
         throw new ArgumentNullException();
      }
      else if(errors.Count == 0)
      {
         throw new ArgumentException("At least one error must be present");
      }
      Errors = errors;
   }
}

使用ArgumentNullException时,构造函数中抛出的那些异常(ArgumentExceptionMyException)会造成伤害吗?

这是此异常的用例:

class Program
{
    private static void ErrorHandling()
    {
        List<string> lst = new List<string>();

        // ... here do some checks and insert the errors in the list 'lst'

        // This check prevent the ArgumentNullException and
        // the ArgumentException to be thrown
        if (lst.Count > 0) 
        {
            throw new MyException(lst);
        }
    }

    static void Main(string[] args)
    {
        try
        {
            ErrorHandling();
        }
        catch(MyException e)
        {
            foreach(string s in e.Errors)
            {
                Console.WriteLine(s);
            }
        }
    }
}

我谈论的危害是:如果由于某些原因,使用MyException的程序员不检查输入列表(if (lst.Count > 0)),可能会导致不必要的后果。 ArgumentNullException / ArgumentException

我认为这可能会导致错误,导致程序员尝试使用错误的参数抛出MyException,而抛出ArgumentNullException / ArgumentException

我应该:

  • 请勿签入MyException的构造函数,而将Errors属性的管理完全由用户负责
  • 进行检查并抛出ArgumentNullException / ArgumentException,因为这会导致错误

1 个答案:

答案 0 :(得分:-1)

  

那些异常会在构建MyException时造成危害

我看不到您在构建任何异常,而且您的MyException类毫无意义。您可以简单地使用另一种private方法来完成您的工作。那么为什么要为此不必要地构建应用程序异常呢?

public List<string> CheckErrors(List<string> errors)
{
      if(errors == null)
      {
         throw new ArgumentNullException()
      }
      else if(errors.Count == 0)
      {
         throw new ArgumentException("At least one error must be present");
      }

 return errors;
}