编写异常辅助方法

Writing an exception helper method

我是 C# 的新手,正在练习抛出异常。从辅助方法中抛出异常以缩短所需代码量是一种好习惯吗?像这样:

    public static void ThrowExcIfNull<T>(T[] array)
    {
        if (array == null) throw new ArgumentNullException("Array is null");
    }
    
    /// <summary>
    /// Does Something
    /// </summary>
    /// <param name="x">The int array to be used</param>
    /// <exception cref="ArgumentNullException">Thrown when the string is 
    /// null</exception> //Is this correct?
    /// <returns>Some integer</returns>
    public static int SomeMethod(this int[] x)
    {
       ThrowExcIfNull(x);
       //Some code here
    }

另外,写文档说“异常是从 someMethod 抛出的”可以吗?任何信息都会有所帮助!谢谢

我认为您应该改用以下模式:

using System;

public static class MyExtensions
{
    /// <summary>
    ///     Magic method.
    /// </summary>
    /// <param name="source">
    ///     The source array.
    /// </param>
    /// <exception cref="ArgumentNullException">
    ///     <paramref name="source" /> is <c>null</c>.
    /// </exception>
    /// <returns>
    ///     Some magic value only you know about.
    /// </returns>
    public static int SomeMethod(this int[] source)
    {
        if (source == null)
            throw new ArgumentNullException(nameof(source));

        return 42;
    }
}

为什么?

  • 您将 ThrowExcIfNull 作为扩展方法公开,说实话这很奇怪
  • 如果您查看 https://referencesource.microsoft.com/#q=throwif,您会发现它们永远不会 public
  • 除了 CancellationToken.ThrowIfCancellationRequested 但这是一个例外情况

如果你绝对想要这样的方法

至少传递参数名称以便于调试:

using System;

public static class MyExtensions
{
    public static int SomeMethod(this int[] source)
    {
        ThrowIfNull(source, nameof(source));

        return 42;
    }

    private static void ThrowIfNull(object value, string parameter)
    {
        if (value == null)
            throw new ArgumentNullException(parameter);
    }
}

但是现在你有另一个问题,堆栈跟踪中显示的第一个方法将是 ThrowExcIfNull:

不使用辅助方法,只看区别:

crystal清楚错误的来源。

你可能会需要这个方法:

  • 如果你在数百个地方使用它
  • 如果要将消息翻译成用户的文化,例如中文
  • 等等