Когда вы пытаетесь получить доступ к ключу, которого нет в Словаре (например), вот трассировка стека, которую вы получаете:
at System.ThrowHelper.ThrowKeyNotFoundException()
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
.... .... (my own code stack trace)
Как и многие другие, я регистрирую эти ошибки, когда они появляются, и пытаюсь выяснить, что произошло.
Я хочу получить две ключевые информации: где это произошло (трассировка стека очень полезна для этого) и ключ, вызвавший исключение, которое нигде не появляется.
Либо я неправильно выглядел (класс KeyNotFoundException содержит элемент «Данные», который всегда пуст, а поле «Сообщение» не содержит значения ключа), либо он не был включен в рамки вообще.
Я не могу представить, чтобы никто из команды .net BCL думал, что это будет полезной функцией. Мне любопытно узнать, почему они не включили это. Есть ли веские причины не делать этого?
Как вы справляетесь с этими исключениями? Единственная альтернатива, о которой я могу подумать, - это использовать пользовательский метод расширения в словаре, который бы обернул вызов, перехватил исключение и перебросил его дополнительной информацией о ключе, но это не помогло бы для кода, которым я не владею, и это кажется сломанным, чтобы изменить такую "базовую" функциональность.
Что вы думаете?
Мне известен этот вопрос , касающийся общего факта, что нельзя получить доступ к аргументам метода, вызвавшего исключение. Мой вопрос конкретно связан с KeyNotFoundException.
Редактировать: Мне известен шаблон TryGetValue, я делаю это все время, когда ожидаю, что моя коллекция может не содержать ключ. Но когда он должен содержать его, я не проверяю, потому что я предпочитаю, чтобы моя программа не работала с исключением, чтобы я знал, что что-то неожиданное произошло до (то есть в момент, когда ключ должен был быть вставлен)
Я мог бы обернуть ошибку / перехватить / записать в журнал / перебросить вокруг всего моего доступа к словарю, но это привело бы к трудному для чтения коду, засоренному всеми моими вещами обработки / регистрации исключений.