Как уже указывалось в нескольких ответах, скажите Visual Studio, что нужно использовать Throw для NullReferenceException.
Как сказать VS, чтобы он ломался при возникновении необработанных исключений
- Меню отладки | Исключения (или Ctrl + Alt + E )
- Детализация общеязыковых исключений времени выполнения
- Детализация в системе
- Найдите System.NullRefernceException и установите флажок Разрывать всякий раз, когда выдается это исключение, вместо того, чтобы позволять ему переходить к любым установленным блокам Catch
Так что теперь, когда это произойдет, VS немедленно прервется, и строка Current Statement будет сидеть в выражении, которое имеет значение null.
Эта возможность полезна для всех видов исключений, включая пользовательские (можно добавить полное имя типа, и VS будет соответствовать ему во время отладки)
Единственный недостаток этого подхода - если в отладчике загружен код, который следует плохой практике бросания и перехвата большого количества искомых исключений, в этом случае он снова превращается в проблему сена / иголки ( если, конечно, вы не можете исправить этот код - тогда вы решили две проблемы:)
Еще одна хитрость, которая может пригодиться (но только в некоторых языках) - это использование ключевого слова When (или эквивалентного) ... В VB это выглядит как
Try
' // Do some work '
Catch ex As Exception When CallMethodToInspectException(ex)
End Try
Хитрость в том, что выражение When оценивается до того, как стек вызовов разматывается на блок Catch . Поэтому, если вы используете отладчик, вы можете установить точку останова в этом выражении, и если вы посмотрите на окно стека вызовов (Debug | Windows | Callstack), вы сможете увидеть и перейти к строке, которая вызвала исключение.
(Вы можете выбрать возврат false из CallMethodToInspectException, поэтому блок Catch будет игнорироваться, и среда выполнения продолжит поиск в стеке соответствующего блока Catch - что может позволить вести запись, которая не влияет на поведение, и с меньшими накладными расходами, чем улов и повторный бросок)
Если вы просто заинтересованы в неинтерактивном ведении журнала, то, если у вас есть отладочная сборка (или, в некоторой степени, поскольку у вас есть проблемы с оптимизацией, сборка выпуска с PDB), вы можете получить большую часть необходимой информации. чтобы отследить ошибку из исключительной ситуации ToString, с включенным номером трассировки стека с номером строки.
Если, однако, номера строки было недостаточно, вы также можете получить номер столбца (в значительной степени, конкретное локальное выражение или выражение, равное нулю), извлекая StackTrace для исключения (используя либо вышеприведенную технику, либо просто в сам блок захвата):
int colNumber = new System.Diagnostics.StackTrace(ex, true).GetFrame(0).GetFileColumnNumber();
Хотя я не видел, что он делает для NullReference или других сгенерированных во время выполнения исключений, он также может быть заинтересован в рассмотрении Exception Hunter как инструмента статического анализа.