Добавление дополнительной информации к пользовательскому исключению

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
11
задан 7 September 2008 в 20:50
поделиться

6 ответов

Вы не должны заполняться .Message с отладочной информацией, а скорее с краткой, полезной частью текста.

http://msdn.microsoft.com/en-us/library/system.exception.message.aspx

Текст сообщения должен полностью описать ошибку и, если это возможно, должен объяснить, как исправить его. Значение Свойства сообщения включено в информацию, возвращенную ToString.

Свойство сообщения установлено только при создании Исключения. Если никакое сообщение не было предоставлено конструктору для текущего экземпляра, система предоставляет сообщение по умолчанию, которое отформатировано с помощью культуры существующей системы.

[..]

Примечания наследникам:

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

Сообщение об ошибке должно быть локализовано.

Данные ответа не квалифицируют как описание.

Не будучи знакомым с elmah, я не могу сказать Вам, как расшириться Exception класс при использовании его. Делает реализацию elmah его собственный подкласс к Exception? Или интерфейс? Можно ли разделить его на подклассы сами?

6
ответ дан 3 December 2019 в 04:54
поделиться

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

5
ответ дан 3 December 2019 в 04:54
поделиться

В пользовательских исключениях, таких как этот, что дополнительные данные ответа должны войти в исключение "сообщение"?

Нет, как Sören уже указал. Однако Ваш тип исключительной ситуации мог переопределить ToString и разумно добавьте информацию о данных ответа там. Это - совершенно нормальная практика, следовавшая многими типами исключительной ситуации в BCL (Библиотека базовых классов), таким образом, Вы не будете плавать против потока. Например, взгляните на Систему. IO.FileNotFoundException. Реализация ToString в SSCLI (Ротор):

public override String ToString()
{
    String s = GetType().FullName + ": " + Message;

    if (_fileName != null && _fileName.Length != 0)
        s += Environment.NewLine + String.Format(Environment.GetResourceString("IO.FileName_Name"), _fileName);

    if (InnerException != null)
        s = s + " ---> " + InnerException.ToString();

    if (StackTrace != null)
        s += Environment.NewLine + StackTrace;

    try
    {
        if(FusionLog!=null)
        {
            if (s==null)
                s=" ";
            s+=Environment.NewLine;
            s+=Environment.NewLine;
            s+="Fusion log follows: ";
            s+=Environment.NewLine;
            s+=FusionLog;
        }
    }
    catch(SecurityException)
    {

    }
    return s;
}

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

Как я могу заставить Elmah записывать дополнительную информацию от поля в пользовательском исключении

ELMAH хранит результат вызова ToString на исключении как детали ошибки поэтому, если Вы имеете ToString реализованный, как предписано, информация зарегистрировать без дальнейшей работы. Единственная проблема - то, что зарегистрированная деталь будет неструктурированным текстом.

11
ответ дан 3 December 2019 в 04:54
поделиться

Я не полностью понимаю вопроса, но Вы, кажется, спрашиваете, что сделать с дополнительными данными исключения, если это не Ваш вопрос, не стесняются игнорировать это.

Я думаю, что важный вопрос спросить - то, что точно сообщение об исключении для? Это не для знания, куда исключение прибыло из, отслеживание стека для этого; это не должно инкапсулировать исключение в более общем, которое должно быть сделано с полем InnerException; в случае, где Ваше исключение только повышено от конкретного места в Вашем коде, это даже не для описания, какую ошибку Вы имели - это - то, для чего тип исключения.

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

Так, насколько я понимаю Ваш вопрос, я думаю, что лучший способ сохранить эту 'дополнительную информацию', которая получена от другой системы, как InnerException. Я не знаю Elmah, но если это будет достойно, то это проверит на InnerExceptions и сохранит их.

1
ответ дан 3 December 2019 в 04:54
поделиться

Elmah является http модулем, который записывает необработанные исключения.

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

0
ответ дан 3 December 2019 в 04:54
поделиться

Я не понимаю вопроса - Вы расширяете Систему. Исключение, и Вы уже добавили поле Elmah. Это - то, где это принадлежит - как общественная собственность самого исключения.

0
ответ дан 3 December 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: