Написание вспомогательного метода исключения - PullRequest
1 голос
/ 03 апреля 2019

Я новичок в C # и практиковал бросать исключения. Является ли хорошей практикой генерировать исключение из вспомогательного метода, чтобы сократить объем необходимого кода? Вот так:

    public static void ThrowExcIfNull<T>(this 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"? Любая информация поможет! Спасибо

1 Ответ

4 голосов
/ 03 апреля 2019

Я думаю, вы должны использовать следующий шаблон:

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, вы увидите, что они никогда не будут публичными
  • за исключением 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:

enter image description here

Просто посмотрите на разницу без использования этого вспомогательного метода:

enter image description here

Совершенно ясно, откуда возникла ошибка.

Возможно, вам понадобится этот метод:

  • если вы используете его буквально в сотнях мест
  • если сообщения должны быть переведены в культуру пользователя, например, на китайский язык
  • и т.д. * * тысяча пятьдесят один
...