Свойство System.Exception.Data

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

Используйте объект, System.Collections.IDictionary возвращаемый свойством Data , для хранения и получения дополнительных сведений, относящихся к исключению. Информация находится в виде произвольного числа определяемых пользователем пар ключей и значений. Ключевой компонент каждой пары "ключ-значение" обычно является идентифицируя строку, а компонент значения пары может быть любым типом объекта.

Безопасность пары "Ключ-значение"

Пары "ключ-значение", хранящиеся в коллекции, возвращаемой Data свойством, не защищены. Если приложение вызывает вложенный ряд подпрограмм, и каждая подпрограмма содержит обработчики исключений, результирующий стек вызовов содержит иерархию этих обработчиков исключений. Если подпрограмма нижнего уровня создает исключение, любой обработчик исключений верхнего уровня в иерархии стека вызовов может считывать и/или изменять пары "ключ-значение", хранящиеся в коллекции любым другим обработчиком исключений. Это означает, что информация в парах "ключ-значение" не является конфиденциальной и что приложение будет работать правильно, если информация в парах "ключ-значение" повреждена.

Ключевые конфликты

Конфликт ключей возникает, когда разные обработчики исключений указывают один и тот же ключ для доступа к паре "ключ-значение". Используйте осторожность при разработке приложения, поскольку следствием конфликта ключей является то, что обработчики исключений нижнего уровня могут непреднамеренно взаимодействовать с обработчиками исключений более высокого уровня, и это взаимодействие может привести к тонким ошибкам программы. Однако если вы осторожны, вы можете использовать ключевые конфликты для улучшения приложения.

Избегайте ключевых конфликтов

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

Предположим, что два приложения с именем "Продукты и поставщики" имеют метод с именем Sales. Метод Sales в приложении Products предоставляет идентификационный номер (единицу хранения акций или номер SKU) продукта. Метод Sales в приложении "Поставщики" предоставляет идентификационный номер или идентификатор безопасности поставщика. Следовательно, соглашение об именовании для этого примера дает ключи, "Products.Sales.SKU" и "Suppliers.Sales.SID".

Конфликты ключей эксплойтов

Конфликты ключей эксплойтов с помощью одного или нескольких специальных ключей для управления обработкой. Предположим, в одном сценарии обработчик исключений верхнего уровня в иерархии стека вызовов перехватывает все исключения, создаваемые обработчиками исключений нижнего уровня. Если существует пара "ключ-значение" со специальным ключом, обработчик исключений высокого уровня форматирует оставшиеся пары "ключ-значение" в IDictionary объекте в некотором нестандартном порядке; в противном случае остальные пары "ключ-значение" форматируются в обычном режиме.

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

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