Как пройти 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"}