Как пройти Exception.Data

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

Я добавляю важные пользовательские значения в объект Exception.Data. Тем не менее, я не могу понять, какой тип мне нужно использовать в моем методе для всего объекта данных, который будет передан.

Вот мой код:

catch (Exception exc)
{
    exc.Data.Add("ID", id);
    emailConnector.sendErrorEmail(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString() + "." + System.Reflection.MethodBase.GetCurrentMethod().Name.ToString(), exc.Message, exc.Data, exc.StackTrace);
}

Я передаю exc.Data методу sendErrorEmail, поэтому в объявлениях параметров у меня есть:

public void sendErrorEmail(string origin, string error_message, IDictionary<object, object> data, string stack)

Но я не могу получить правильное объявление типа для Exception.Data. Я предпочитаю сохранять переменные и структуру одинаковыми (без новых переменных), потому что в настоящее время у меня есть десятки методов, вызывающих sendErrorEmail в блоке Catch.

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

Спасибо

2 ответа

Решение

Глядя на страницу справки, кажется, что ваша проблема в том, что тип exc.Data является IDictionary в то время как вы объявляете это как IDictionary<object, object>,

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

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

Тип Exception.Data - ListDictionaryInternal. Это частный каркасный класс, поэтому вы не можете использовать его напрямую, но он реализует следующие открытые интерфейсы:

[0]: {Name = "IDictionary" FullName = "System.Collections.IDictionary"}
[1]: {Name = "ICollection" FullName = "System.Collections.ICollection"}
[2]: {Name = "IEnumerable" FullName = "System.Collections.IEnumerable"}
Другие вопросы по тегам