Пользовательские атрибуты и исключения в .net - PullRequest
9 голосов
/ 24 ноября 2008

во время написания пользовательского атрибута в C # мне было интересно, есть ли какие-либо рекомендации или рекомендации относительно исключений в атрибутах. Должен ли атрибут проверять заданные параметры на достоверность? Или это задача пользователя собственности?

В простом тесте, которое я сделал, исключение не выдавалось до тех пор, пока я не использовал GetCustomAttributes для типа с атрибутом выброса исключения. Я просто думаю, что немного неудобно получать исключение из атрибута, только когда явно его запрашивает.


Пример атрибута с исключением:

[AttributeUsage(AttributeTargets.Interface, AllowMultiple = false, Inherited = false)]
sealed public class MyAttribute : Attribute
{
    public string SomeValue { get; private set; }

    public MyAttribute(string someValue)
    {
        if(string.IsNullOrEmpty(someValue))
        {
            throw new ArgumentNullException("path");
        }

        if(!someOtherCheck(someValue))
        {
            throw MyAttributeException("An other error occured");
        }

        SomeValue = someValue;
    }
}

Ответы [ 3 ]

7 голосов
/ 24 ноября 2008

Атрибуты фактически создаются только при использовании отражения, так что это единственный раз, когда вы можете выдать исключение. Я не могу вспомнить, чтобы когда-либо использовал атрибут и заставил его вызвать исключение. Атрибуты обычно предоставляют данные, а не реальное поведение - я ожидаю, что код, который использует атрибут, обеспечивает любую проверку. Я знаю, что это не похоже на нормальную инкапсуляцию, но так, как это обычно бывает в моем опыте.

2 голосов
/ 24 ноября 2008

За некоторыми исключениями, имеющие атрибуты, зависящие от компилятора (например, [PrincipalPermission] и т. Д.), Атрибуты не могут напрямую взаимодействовать с кодом без запроса. Однако если вы используете инструмент AOP (Aspect Oriented Programming) " PostSharp ", ваши атрибуты аспекта могут добавить поведение в ваш класс. Не просто, но иногда это очень полезный трюк.

1 голос
/ 24 ноября 2008

У нас есть несколько достаточно сложных атрибутов в нашем проекте, поэтому мы включаем проверку входных данных. Например, как часть нашей работы с I18N и L10N, у нас есть атрибуты, которые выполняют поиск ресурсов (во многом аналогично атрибутам в структуре, которые используются для локализации строк Category и Description для свойств в конструкторах). Эти пользовательские атрибуты должны иметь некоторую проверку, чтобы они могли работать.

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

Итак, в заключение, это действительно зависит от сложности атрибута; если он создается с одним видом данных, но ожидается, что он предоставит другой (например, при поиске ресурсов), он должен содержать проверку, в противном случае, вероятно, не должен.

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