Exception.Data
является нетипизированным IDictionary
:
public virtual IDictionary Data { get; }
Поэтому методы доступа get
и set
возвращают и принимают значение типа object
, которое необходимо преобразовать или преобразовать в нужный тип, например ::
public const string ExceptionMessageKey = "UI Error Message";
lblErrorMessage.Text = ex.Data[ExceptionMessageKey]?.ToString();
(где ?.
- условный оператор c # 6.0 null ). Или альтернативно:
lblErrorMessage.Text = ex.Data[ExceptionMessageKey] as string;
Кроме того, если вы более знакомы с универсальным интерфейсом IDictionary<TKey, TValue>
, обратите внимание на следующее отличие. При использовании нетипизированного IDictionary
и доступе к ключу, который не существует, документация получателя заявляет :
Стоимость объекта
Элемент с указанным ключом или null , если ключ не существует.
Напротив, в документации IDictionary<TKey, TValue>
указано, что KeyNotFoundException
будет выброшено, когда ключ не найден. Нет TryGetGetValue()
для IDictionary
.
Пример скрипта .Net здесь .
Update
Кроме того, является ли ключевое слово const
обязательным или просто наилучшей практикой в этом случае? Использование const
здесь является исключительно хорошей практикой. Поскольку вы собираетесь получать и устанавливать подробности исключений в своем словаре Data
со стандартизованными ключами, хорошей идеей будет централизовать фактические значения этих ключей в одном месте вашего кода, который может использоваться как производителями, так и потребителями вашего Exception
, например класс статических констант :
public static class Constants
{
public const string ExceptionMessageKey = "UI Error Message";
}
Кроме того, почему нужно объявить строковую константу перед использованием свойства data класса исключений? - в этом нет необходимости. Я сделал это только для того, чтобы сделать значение ExceptionMessageKey
публичной константой.
Когда я использую условный оператор null с обрисованным вами синтаксисом, я получаю ошибку времени компиляции, говорящую «Синтаксическая ошибка»: «ожидается». - тогда вы, вероятно, используете версию c # ранее чем 6.0. Если это так, вы можете использовать следующий более старый синтаксис:
var value = ex.Data[Constants.ExceptionMessageKey];
string text = value == null ? null : value.ToString();
Наконец, как уже упоминалось в Обработка и создание исключений в .NET Хорошей практикой является использование более подходящего производного типа Exception
. Вы можете выбрать общий, ранее существовавший тип, такой как ApplicationException
или , определить свой собственный , и в этом случае «Сообщение об ошибке пользовательского интерфейса» может быть сделано скорее как свойство исключения чем запись в словаре Data
.